同步类容器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){@Overridepublic 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