HashTable、SynchronizedMap 和 ConcurrentHashMap 有什么區別


 

 

 

 

SynchronizedMap

  一次性鎖住整張表來保證線程安全,所以每次只能有一個線程來訪問map。

  • synchronizedMap實現了Map接口
  • 構造synchronizedMap時將this指針傳遞給監視器對象mutex,即同步方法塊鎖住的是synchronizedMap對象自身,並將方法代理在Map集合m的方法上
  • synchronizedMap是Collections的私有靜態內部類,可以通過Collecitons.synchronizedMap(Map)方法獲取一個synchronizedMap向上轉型為Map對象,對外發布。
  • synchronizedMap將一個非線程安全的Map集合通過同步方法塊鎖住對象自身包裝為線程安全的Map集合

 

ConcurrentHashMap

  使用分段鎖來保證在多線程下的性能。一次鎖住一個桶。默認將hash表分為16個桶, 諸如 get put remove等常見操作只鎖當前需要用到的桶。

  這樣只能一個線程進入,現在卻能同時有16個寫線程執行,並發性能的提升是顯而易見的。   --- JDK7

  

  另外ConcurrentHashMap使用了一種不同的迭代方式,當iterator被創建后,集合再發生改變就不再拋出ConcurrentModificationException異常,取而代之的是

  在改變時new新的數據從而不影響原有的數據,iterator完成后再將頭指針替換為新的數據,這樣iterator線程可以使用原來老的數據,而寫線程也可以並發的完成改變。

 

參考:https://codepumpkin.com/hashtable-vs-synchronizedmap-vs-concurrenthashmap/


免責聲明!

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



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