ConcurrentHashMap底層原理

2021-10-22 18:51:33 字數 1966 閱讀 9162

出自jdk5新引進的concurrent包,concurrenthashmap主要解決了兩個問題:

相較於只使用synchronized的hashtable提高了效能,根據具體場景進行不同的設計,盡量避免了重量級鎖。

不同於hashmap,採用了fail-safe弱一致性迭代器,再迭代器使用過程中,可以對元素進行更新操作。

簡單說就是可以乙個可以併發操作保證安全性並且效能不差的hashmap。

可以看到hashtable基本上被淘汰,因為synchronized效率很低。concurrenthashmap可以做到讀取資料不加鎖,並且在寫操作的時候能將鎖粒度盡可能的小,關鍵在於使用了鎖分離技術,對不同部分進行加鎖操作。

static

class

node

implements

map.entry

這是當hash函式計算出來的存放下標為null(沒有元素時),會呼叫castabat,繼續跟蹤。

static

final

boolean

castabat

(node

tab,

int i,

node

c, node

v)//u是unsafe物件

private

static

final sun.misc.unsafe u;

發現最終是呼叫unsafe類下的compareandswapobject。

else

{ v oldval = null;

synchronized

(f){if(

tabat

(tab, i)

== f){if

(fh >=0)

{ bincount =1;

for(node

e = f;

;++bincount)

{

else邏輯就是當計算出來的存放下標不為null的情況下,當前很多細節暫時不關注。f是這裡下標位置的煉表頭元素,對該物件上鎖,保證了執行緒安全。

與1.8大有不同,採用了segment分段鎖技術,在多執行緒併發操作時,對同乙個segment進行同步加鎖,保證資料的安全。可以看到segment繼承自reentrantlock,其加鎖的方式也是基於reentrantlock鎖機制

以上都是不考慮擴容情況,如果發生了擴容,則情況就非常複雜了;簡單說,就是它在擴容的時候,會保留兩個 table,乙個用於擴容,乙個還在提供服 務,做到真正的不停機。

concurrenthashmap的讀是否要加鎖,為什麼?

concurrenthashmap的鎖分段技術?

concurrenthashmap的迭代器是強一致性的迭代器還是弱一致性的迭代器?

mashmap和concurrenthashmap怎麼確定key的唯一性?

hashtable和hashmap、concurrenthashmap?

concurrenthashmap的原理使用?

concurrenthashmap在jdk1.8做了哪些優化?

、concurrenthashmap?

6. concurrenthashmap的原理使用?

concurrenthashmap在jdk1.8做了哪些優化?

concurrenthashmap如何實現執行緒安全?

ConcurrentHashMap底層分析

jdk1.8之前,通過segments實現,segments繼承reentrantlock,segments充當鎖的角色,每乙個table 桶 都有自己的鎖,因此jdk1.8之前concurrenthashmap採用分段鎖的機制來實現併發的更新操作,提高併發效率。table相當於hashmap中的陣...

ConcurrentHashMap底層原始碼實現

concurrenthashmap底層原始碼實現 空構造方法 常用方法put k key,v value 呼叫putval方法 key,value,false putval key,value,false 如果key或者value為空,則丟擲空指標異常,說明不能新增空值 定義hash為hash值sp...

ConcurrentHashMap底層實現

concurrenthashmap融合了hashtable和hashmap二者的優勢 hashtable是做了同步的,hashmap沒有同步,所以hashmap在單執行緒情況下效率高,hashtable在多執行緒情況下,同步操作能保證程式執行的正確性 但是hashtable每次同步執行都要鎖住整個結...