ConcurrentHashMap原理分析

2021-09-01 09:11:40 字數 1269 閱讀 5853

hashtable是乙個執行緒安全的類,它使用synchronized來鎖住整張hash表來實現執行緒安全,即每次鎖住整張表讓執行緒獨佔。concurrenthashmap允許多個修改操作併發進行,其關鍵在於使用了鎖分離技術。它使用了多個鎖來控制對hash表的不同部分進行的修改。

concurrenthashmap內部使用段(segment)來表示這些不同的部分,每個段其實就是乙個小的hashtable,它們有自己的鎖。只要多個修改操作發生在不同的段上,它們就可以併發進行

有些方法需要跨段,比如size()和containsvalue(),它們可能需要鎖定整個表而而不僅僅是某個段,這需要按順序鎖定所有段,操作完畢後,又按順序釋放所有段的鎖。

concurrenthashmap使用分段鎖技術,將資料分成一段一段的儲存,然後給每一段資料配一把鎖,當乙個執行緒占用鎖訪問其中乙個段資料的時候,其他段的資料也能被其他執行緒訪問,能夠實現真正的併發訪問。如下圖是concurrenthashmap的內部結構圖:

從圖中可以看到,concurrenthashmap內部分為很多個segment,每乙個segment擁有一把鎖,然後每個segment(繼承reentrantlock)繼承了reentrantlock,表明每個segment都可以當做乙個鎖。這樣對每個segment中的資料需要同步操作的話都是使用每個segment容器物件自身的鎖來實現。只有對全域性需要改變時鎖定的是所有的segment。

segment下面包含很多個hashentry列表陣列。對於乙個key,需要經過三次(為什麼要hash三次下文會詳細講解)hash操作,才能最終定位這個元素的位置,這三次hash分別為:

對於乙個key,先進行一次hash操作,得到hash值h1,也即h1 = hash1(key);

將得到的h1的高幾位進行第二次hash,得到hash值h2,也即h2 =

hash2(h1高幾位),通過h2能夠確定該元素的放在哪個segment;

將得到的h1進行第三次hash,得到hash值h3,也即h3 =

hash3(h1),通過h3能夠確定該元素放置在哪個hashentry。

concurrenthashmap中主要實體類就是三個:concurrenthashmap(整個hash表),segment(桶),hashentry(節點),對應上面的圖可以看出之間的關係

ConcurrentHashMap 原理簡要分析

在之前寫過hashtable 與hashmap 兩者之間的異同 通過前面文章,可以知道hashmap 中未進行同步考慮,而 hashtable 則使用了 synchronized 帶來的直接影響就是可選擇,我們可以在單執行緒時使用 hashmap 提高效率,而多執行緒時用 hashtable 來保證...

ConcurrentHashMap 的原理和結構

concurrenthashmap 是乙個高效的執行緒安全的hashmap,它的加鎖機制和hashtable不同,後者用的是低效的synchronized,前者用的是lock。接著前一期的hashmap,先簡單介紹下concurrenthashmap結構,再以它們的主要函式 put 和 get為切入...

ConcurrentHashMap原理解析

什麼是concurrenthashmap?眾所周知,hashmap是一種非常高效的資料結構,但是依舊有它的缺陷。那就是在併發插入資料時,有可能會出現帶環鍊錶,讓下一次的讀操作出現死迴圈。於是為了避免hashmap的執行緒安全問題,concurrenthashmap應運而生。concurrenthas...