標籤:htable 容器類 map 容器 mod 出現 迭代 exception add
Java並發編程:同步容器
整理自:部落格園-海子-http://www.cnblogs.com/dolphin0520/p/3933404.html
1、同步容器出現原因
常用的ArrayList,LinkedList,HashMap,HashSet,Deque等都是線程不安全的;
Java為方便多線程編程,提供了同步容器供使用者使用。
2、同步容器類:
2.1:第一類:Vector(ArrayList)、Stack(Vector的子類)、HashTable(HashMap)
2.2:第二類:Collections類中提供的靜態Factory 方法建立的類。如Collections.synchronizedXxx()擷取
3、同步容器的缺陷:
3.1:使用synchronized關鍵字進行同步降低了效率;
3.2:像Vector這種add和get方法都進行同步,在多線程讀時,競爭鎖,效率很低。
3.3:多線程操作同步容器時,可能拋出 ConcurrentModificationException異常。
4、ConcurrentModificationException異常原因及解決
4.1:單線程下:Iterator迭代器迭代時,調用了list的remove修改了容器大小,應該調用Iterator的remove方法;
4.2:多線程下:多個線程執行Iterator並修改,此時Iterator線程私人。
改正:【1】擷取Iterator時,使用synchronized或者Lock同步。
【2】使用並發容器CopyOnWriteArrayList代替ArrayList和Vector
5、並發容器:java.util.concurrent包
同步容器將所有對容器狀態的訪問都序列化,保證了安全,卻降低了效率;
5.1:ConcurrentHashMap代替同步的Map(Collections.synchronized(new HashMap()),HashMap同步時鎖住所有的段,而ConcurrentHashMap只鎖住對應的段(segment);
5.2:CopyOnWriteArrayList和CopyOnWriteArraySet分別代替List和Set,寫時複製List和寫時複製set;
5.3: 其他
Java並發機制(5)--同步容器與並發容器