同步类容器1
1.线程都是安全的。
2.在某些场景下需要加锁来保护“复合操作”
a.迭代:反复去访问元素、遍历完容器所有的元素
b.跳转:根据下标制定去访问查找元素
c.条件运算
3.复合操作在多线程并发修改内容时:可能会出现意外的行为、容器迭代的过程中被并发的修改了内容,这是早期的迭代器设计没有考虑的问题
同步类容器2
1.古老的vector、HashTable,这些容器的同步功能其实只是都有 Collections.synchronizedList(new ArrayList<String>()); 等工厂方法去创建时间的。
2.底层 synchronizedList 对每个公用方法都进行了同步,使得每次只有一个线程去访问容器的姿态(必须保证安全同时,也必须要有足够好的性能)。
例1
package demo5;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
/**
* Created by liudan on 2017/7/9.
*/
public class MyThread1 extends Thread {
/*同步类容器、动态数组*/
public static void main(String[] args) {
final Vector<String> ticksts = new Vector<>();
List<Object> lsit = new ArrayList<>();
for (int i=1;i<=10;i++){
ticksts.add("G1001-火车票-G000X"+i);
}
for (int i=1;i<=10;i++){
new Thread("线程00"+i){
@Override
public void run() {
while (true){
if (ticksts.isEmpty()) break;
System.err.println(Thread.currentThread().getName()+" "+ticksts.remove(0));
}
}
}.start();
}
}
}
输出:
线程001 G1001-火车票-G000X1 线程001 G1001-火车票-G000X2 线程001 G1001-火车票-G000X3 线程001 G1001-火车票-G000X4 线程002 G1001-火车票-G000X5 线程002 G1001-火车票-G000X7 线程001 G1001-火车票-G000X6 线程001 G1001-火车票-G000X9 线程001 G1001-火车票-G000X10 线程002 G1001-火车票-G000X8