ConcurrentHashMap
Java 5.0 在 java.util.concurrent 包中提供了多種並發容器類來改進同步容器的性能。
ConcurrentHashMap 同步容器類是Java 5 增加的一個線程安全的哈希表。對
與多線程的操作,介於 HashMap 與 Hashtable 之間。內部采用“鎖分段”
機制替代 Hashtable 的獨占鎖。進而提高性能。
此包還提供了設計用於多線程上下文中的 Collection 實現:
ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、
CopyOnWriteArrayList 和 CopyOnWriteArraySet。當期望許多線程訪問一個給
定 collection 時,ConcurrentHashMap 通常優於同步的 HashMap,
ConcurrentSkipListMap 通常優於同步的 TreeMap。當期望的讀數和遍歷遠遠
大於列表的更新數時,CopyOnWriteArrayList 優於同步的 ArrayList。
ConcurrentHashMap采用“鎖分段”機制
每個段都是一個獨立的鎖
當多線程並發訪問時,可以並行訪問
支持多個線程同時訪問
效率高、線程安全
JDK1.8之后使用CAS
實例:
public class TestCopyOnWriteArrayList { public static void main(String[] args) { HelloTree ht = new HelloTree(); for(int i = 0;i<10;i++){ new Thread(ht).start(); } } } class HelloTree implements Runnable{ private static List<String> list = Collections.synchronizedList(new ArrayList<String>()); static{ list.add("AA"); list.add("BB"); list.add("CC"); } @Override public void run() { Iterator<String> it = list.iterator(); while(it.hasNext()){ System.out.println(it.next()); list.add("AA"); } } }
此時時邊寫邊讀,會報異常
並發修改異常!!!
只需要替換一行即可:
//private static List<String> list = Collections.synchronizedList(new ArrayList<String>()); private static CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
CopyOnWriteArrayList
添加多時,效率低,每次添加時都會進行一次復制,開銷非常大
並發迭代多時可以選擇