傳統方式下的Collection在迭代集合時,不容許對集合進行修改。 java
傳統方式下用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(); } } }結果: