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/