final v putval
(k key, v value,
boolean onlyifabsent)
//這句**表示陣列正在擴容(moved=-1),正在老陣列中的元素轉移到新的陣列中,不能對老陣列進行操作了
//當前執行緒考慮到它乙個人也挺辛苦的 我去幫幫他把 這一塊拷貝元素的原理是每個執行緒去領取任務的形式來搬運節點
//從陣列後面開始搬,假如長度為32, 第乙個執行緒領取的任務是 16- 32 這一塊區域的節點,第二個執行緒
//是從0-16之間的節點。
elseif(
(fh = f.hash)
== moved)
tab =
helptransfer
(tab, f)
;//表示當前節點上面已經有元素了,說明這個節點資料結構不是鍊錶就是紅黑樹了為了避免執行緒安全問題,
//concurrenthashmap採用了分段鎖為了程式效能著想,只鎖住乙個節點,其它的節點別的執行緒還是可以操作的。
else
node
pred = e;
//如果鍊錶不存在這個key,直接找到鍊錶的最後乙個節點,將當前節點直接插入到
//鍊錶的末端,然後跳出迴圈if(
(e = e.next)
== null)}}
//紅黑樹
else
if(f instanceof
treebin)}
}}if(bincount !=0)
}}//累加陣列中的元素
addcount
(1l, bincount)
;return null;
}
node(k,v) table 在初始化的時候考慮了執行緒安全的問題,用了乙個sizectl(擴容閾值)
變數來控制初始化狀態,當某個執行緒來進行初始化的時候,通過cas把sizectl
設定為-1,當另一線程也來初始化的時候讀到sizectl
小於0的時候,表示有執行緒正在進行例項化,就不能去例項化,就讓出cpu的控制權,然後自旋。
private
final node
inittable()
}finally
break;}
}return tab;
}
public v get
(object key)
//遍歷紅黑樹
else
if(eh <0)
return
(p = e.
find
(h, key)
)!= null ? p.val : null;
//遍歷鍊錶節點
while
((e = e.next)
!= null)
}return null;
}
ConcurrentHashMap原始碼分析
hashmap 先說hashmap,hashmap是執行緒不安全 的,在併發環境下,可能會形成環狀鍊錶 hashtable hashtable和hashmap的實現原理幾乎一樣,差別無非是1.hashtable不允許key和value為null 2.hashtable是執行緒安全的。但是hashta...
ConcurrentHashMap原始碼詳解
成員變數private static final int maximum capacity 1 30 private static final int default capacity 16 static final int max array size integer.max value 8 pr...
concurrentHashMap原始碼分析
concurrenthashmap是hashmap的執行緒安全版本,內部也是使用 陣列 鍊錶 紅黑樹 的結構來儲存元素。相比於同樣執行緒安全的hashtable來說,效率等各方面都有極大地提高。在這裡可以使用上篇那個 進行測試,根據結果可以知道concurrenthashmap是執行緒安全的,由於分...