ConcurrentHashMap 的原理和結構

2021-08-06 05:20:34 字數 1359 閱讀 7595

concurrenthashmap 是乙個高效的執行緒安全的hashmap,它的加鎖機制和hashtable不同,後者用的是低效的synchronized,前者用的是lock。

接著前一期的hashmap,先簡單介紹下concurrenthashmap結構,再以它們的主要函式 put 和 get為切入點,分別介紹。這樣更透徹的了解concurrenthashmap。

1. concurrenthashmap 結構:

concurrenthashmap 中也有乙個陣列源**如下:

final segment segments;

我們看下segment裡面的put 和 get函式

v put(k key, int hash, v value, boolean onlyifabsent) finally

}我將中間部分**省略了,可以看出,segment的put方法用的是lock鎖。也就是說concurrenthashmap 中資料實際上都是存在segment中。

2. concurrenthashmap 的put方法:

直接上源**:

public v put(k key, v value)

有裡面涉及到乙個函式 segmentfor,函式實現如下:

final segmentsegmentfor(int hash)

這裡 concurrenthashmap的put方法中的紅色字型部分需要注意下, segmentfor函式返回的是segments[(hash >>> segmentshift) & segmentmask],返回了乙個segment。

而put方法中陣列後面還有put(key, hash, value, false),也就是說concurrenthashmap呼叫put時,資料存入concurrenthashmap鐘陣列segment segments的某乙個segment中了。

這就麻煩了,資料存入了concurrenthashmap中陣列segments中的某乙個segment中了,那麼get時,怎麼取值呢?直接取值肯定不行了。

3. concurrenthashmap 的 get函式

還是直接上源**:

public v get(object key)

還是呼叫了 put中呼叫的函式segmentfor。這就很好理解了,concurrenthashmap中segments陣列有存入了hash值個segment,put和get都是通過hash值得到陣列中的index,然後通過它們的put和get方法來獲取最終的值。

總結:concurrenthashmap 可以認為是多個hashtable的總和(當然所有的鎖機制不一樣)。這樣在一定程度上迴避了部分雜湊衝突。

ConcurrentHashMap 原理簡要分析

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

ConcurrentHashMap原理解析

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

ConcurrentHashMap原理分析

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