Java中ConcurrentHashMap的實現


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的同步性稍弱。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章