ConcurrentHashMap 和 Hashtable 比較,為什么推薦使用ConcurrentHashMap?


HashTable

  • 底層數組+鏈表實現,無論可以還是value都不能為null,線程安全,實現線程安全的方式是在修改數據時鎖住整個HashTable,效率低,ConcurrentHashMap做了相關優化

ConcurrentHashMap

  • 底層采用分段的數組+鏈表實現,線程安全
  • 通過把整個Map分為N個Segment(可重入鎖),可以提供相同的線程安全,但是效率提升N倍,默認提升26倍。(讀操作不加鎖,由於HashEntry的value變量是volatile的,也能保證讀取到最新的值。)
  • Hashtable的synchronized是針對整張Hash表的,即每次鎖住整張表讓線程獨占,ConcurrentHashMap允許多個修改操作並發進行,其關鍵在於使用了鎖分離技術
  • 有些方法需要跨段,比如size()和containsValue(),他們可能需要鎖定整個表而不僅僅是某個段,這需要按順序鎖定所有段,操作完畢后,又按順序釋放所有段的鎖
  • 擴容:段內擴容(段內元素超過該段對應Entry數組長度的75%觸發擴容,不會對整個Map進行擴容),插入前檢查是否需要擴容,以避免無效擴容

鎖分段技術

  • 首先將數據分為一段一段的存儲,然后給每一段數據配一把鎖,當一個線程占用鎖訪問其中一個段數據的時候,其它段的數據也能被其它線程訪問。

*ConcurrentHashMap默認將hash表分為16個桶,諸如get、put、remove等常用操作值鎖住當前需要用到的桶,這樣,原來只能一個線程進入,而現在卻能同時有16個線程執行,並發性能提升顯而易見的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM