传统方式下的Collection在迭代集合时,不允许对集合进行修改。
传统方式下用Collections工具类提供的synchronizedCollection方法来获得同步集合。分析该方法的实现源码:其实就是把方法放到同步代码块中,锁为当前集合对象。
Java5中提供了如下一些同步集合类:场景:有一个集合,对该集合采用迭代器进行遍历之后,又对其添加了一个元素。
我们分别使用Arralist、Vector、Collections.synchronizedList、Collections.synchronizedList使用synchronized关键字进行同步控制、使用java.util.concurrent包中的高效的同步集合ConcurrentLinkedQueue进行测试。
首先创建一个任务,该任务遍历集合,又对其添加了一个元素。public class ModifyCollectionTask implements Runnable { Collection<Integer> list; Lock lock = null; public ModifyCollectionTask(Collection<Integer> slist, Lock lock) { this.list = slist; this.lock = lock; } public void run() { //lock.lock(); //try{ // 遍历列表 for (Integer num : list) { System.out.println("线程"+Thread.currentThread().getName()+"数据为:"+num); } // 向列表添加元素 list.add(30); //}finally{lock.unlock();} } }
public class MultiThreadListTest { public static void main(String[] args) { Collection<Integer> list = new ArrayList<Integer>(); list.add(6); list.add(3); list.add(43); list.add(88); list.add(1); Lock lock = new ReentrantLock(); //启动100个线程,在多线程环境下,测试集合的同步问题 for (int i = 0; i < 100; i++) { new Thread(new ModifyCollectionTask(list, lock)).start(); } } }结果:
public class MultiThreadListTest { public static void main(String[] args) { Collection<Integer> list = new Vector<Integer>(); list.add(6); list.add(3); list.add(43); list.add(88); list.add(1); Lock lock = new ReentrantLock(); //启动100个线程,在多线程环境下,测试集合的同步问题 for (int i = 0; i < 100; i++) { new Thread(new ModifyCollectionTask(list, lock)).start(); } } }结果:
public class MultiThreadListTest { public static void main(String[] args) { Collection<Integer> list = Collections.synchronizedList(new ArrayList<Integer>()); list.add(6); list.add(3); list.add(43); list.add(88); list.add(1); Lock lock = new ReentrantLock(); //启动100个线程,在多线程环境下,测试集合的同步问题 for (int i = 0; i < 100; i++) { new Thread(new ModifyCollectionTask(list, lock)).start(); } } }结果:
public class MultiThreadListTest { public static void main(String[] args) { Collection<Integer> list = new ConcurrentLinkedQueue<Integer>(); list.add(6); list.add(3); list.add(43); list.add(88); list.add(1); Lock lock = new ReentrantLock(); //启动100个线程,在多线程环境下,测试集合的同步问题 for (int i = 0; i < 100; i++) { new Thread(new ModifyCollectionTask(list, lock)).start(); } } }结果: