hashtable效率低
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。
關于鎖分段機制:
HashTable容器在競争激烈的并發環境下表現出效率低下的原因是所有通路HashTable的線程都必須競争同一把鎖,假如容器裡有多把鎖,每一把鎖用于鎖容器其中一部分資料,那麼當多線程通路容器裡不同資料段的資料時,線程間就不會存在鎖競争,進而可以有效提高并發通路效率,這就是ConcurrentHashMap所使用的鎖分段技術。首先将資料分成一段一段地存儲,然後給每一段資料配一把鎖,當一個線程占用鎖通路其中一個段資料的時候,其他段的資料也能被其他線程通路

Segment是一種可重入鎖(ReentrantLock),在ConcurrentHashMap裡扮演鎖的角色;
HashEntry則用于存儲鍵值對資料;
--引自 《java并發程式設計的藝術》
ConcurrentHashMap 和HashMap方法基本上保持一緻。
當多線程通路并處理List的時候會出現并發修改異常:
出現這種情況demo:
那麼如果避免多線程下這種問題的産生呢,利用CopyOnWriteArrayList :
結果: