1. 程式人生 > >Java中ConcurrentHashMap的實現

Java中ConcurrentHashMap的實現

concurrent hashmap


Java中ConcurrentHashMap的實現

ConcurrentHashMap(簡寫CHM)引入了分割,並提供了HashTable支持的所有的功能。在CHM中,支持多線程對Map做讀操作,並且不需要任何的blocking。這得益於CHM將Map分割成了不同的部分,在執行更新操作時只鎖住一部分。根據默認的並發級別(concurrency level),Map被分割成16個部分,並且由不同的鎖控制。這意味著,同時最多可以有16個寫線程操作Map。試想一下,由只能一個線程進入變成同時可由16個寫線程同時進入(讀線程幾乎不受限制),性能的提升是顯而易見的。但由於一些更新操作,如put(),remove(),putAll(),clear()只鎖住操作的部分,所以在檢索操作不能保證返回的是最新的結果。

另一個重要點是在叠代遍歷CHM時,keySet返回的iterator是弱一致和fail-safe的,可能不會返回某些最近的改變,並且在遍歷過程中,如果已經遍歷的數組上的內容變化了,不會拋出ConcurrentModificationExceptoin的異常。

CHM默認的並發級別是16,但可以在創建CHM時通過構造函數改變。毫無疑問,並發級別代表著並發執行更新操作的數目,所以如果只有很少的線程會更新Map,那麽建議設置一個低的並發級別。另外,CHM還使用了ReentrantLock來對segments加鎖。

什麽時候使用ConcurrentHashMap

CHM適用於讀者數量超過寫者時,當寫者數量大於等於讀者時,CHM的性能是低於Hashtable和synchronized Map的。這是因為當鎖住了整個Map時,讀操作要等待對同一部分執行寫操作的線程結束。CHM適用於做cache,在程序啟動時初始化,之後可以被多個請求線程訪問。正如Javadoc說明的那樣,CHM是HashTable一個很好的替代,但要記住,CHM的比HashTable的同步性稍弱。


Java中ConcurrentHashMap的實現