ConcurrentHashMap 原理簡要分析


ConcurrentHashMap 原理簡要分析


在之前寫過HashTable 與HashMap 兩者之間的異同:

http://blog.csdn.net/yaozhifeng123456/article/details/48345707


通過前面文章,可以知道HashMap中未進行同步考慮,而Hashtable則使用了synchronized,帶來的直接影響就是可選擇,我們可以在單線程時使用HashMap提高效率,而多線程時用Hashtable來保證安全。


通過分析Hashtable就知道,synchronized是針對整張Hash表的,即每次鎖住整張表讓線程獨佔,安全的背後是巨大的浪費,慧眼獨具的Doug Lee立馬拿出瞭解決方案----ConcurrentHashMap


ConcurrentHashMapHashtable主要區別就是圍繞着鎖的粒度以及如何鎖


ConcurrentHashMap的實現方式---鎖桶(或段)。ConcurrentHashMaphash表分爲16個桶(默認值),諸如get,put,remove等常用操作只鎖當前需要用到的桶。試想,原來只能一個線程進入,現在卻能同時16個寫線程進入(寫線程才需要鎖定,而讀線程幾乎不受限制),併發性的提升是顯而易見的。


更令人驚訝的是ConcurrentHashMap的讀取併發,因爲在讀取的大多數時候都沒有用到鎖定,所以讀取操作幾乎是完全的併發操作,而寫操作鎖定的粒度又非常細,比起之前又更加快速(這一點在桶更多時表現得更明顯些)。


只有在求size等操作時才需要鎖定整個表。


綜上所述,在多線程併發情況下,ConcurrentHashMap 優於HashTable。

發佈了40 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章