在之前寫過hashtable 與hashmap 兩者之間的異同:
通過前面文章,可以知道hashmap
中未進行同步考慮,而
hashtable
則使用了
synchronized
,帶來的直接影響就是可選擇,我們可以在單執行緒時使用
hashmap
提高效率,而多執行緒時用
hashtable
來保證安全。
通過分析
hashtable
就知道,synchronized
是針對整張
hash
表的,即每次鎖住整張表讓執行緒獨佔,安全的背後是巨大的浪費,慧眼獨具的
doug lee
立馬拿出了解決方案
----concurrenthashmap
。concurrenthashmap
和hashtable
主要區別就是圍繞著鎖的粒度以及如何鎖。
concurrenthashmap
的實現方式
---鎖桶(或段)。
concurrenthashmap
將hash
表分為16
個桶(預設值),諸如
get,put,remove
等常用操作只鎖當前需要用到的桶。試想,原來只能乙個執行緒進入,現在卻能同時
16個寫執行緒進入(寫執行緒才需要鎖定,而讀執行緒幾乎不受限制),併發性的提公升是顯而易見的。
更令人驚訝的是
concurrenthashmap
的讀取併發,因為在讀取的大多數時候都沒有用到鎖定,所以讀取操作幾乎是完全的併發操作,而寫操作鎖定的粒度又非常細,比起之前又更加快速(這一點在桶更多時表現得更明顯些)。
只有在求
size
等操作時才需要鎖定整個表。
綜上所述,在多執行緒併發情況下,concurrenthashmap 優於hashtable。
ConcurrentHashMap原理分析
hashtable是乙個執行緒安全的類,它使用synchronized來鎖住整張hash表來實現執行緒安全,即每次鎖住整張表讓執行緒獨佔。concurrenthashmap允許多個修改操作併發進行,其關鍵在於使用了鎖分離技術。它使用了多個鎖來控制對hash表的不同部分進行的修改。concurrent...
ConcurrentHashMap 的原理和結構
concurrenthashmap 是乙個高效的執行緒安全的hashmap,它的加鎖機制和hashtable不同,後者用的是低效的synchronized,前者用的是lock。接著前一期的hashmap,先簡單介紹下concurrenthashmap結構,再以它們的主要函式 put 和 get為切入...
ConcurrentHashMap原理解析
什麼是concurrenthashmap?眾所周知,hashmap是一種非常高效的資料結構,但是依舊有它的缺陷。那就是在併發插入資料時,有可能會出現帶環鍊錶,讓下一次的讀操作出現死迴圈。於是為了避免hashmap的執行緒安全問題,concurrenthashmap應運而生。concurrenthas...