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...