concurrentHashMap原理詳解

java1.8無論怎麼優化,hashmap仍然不是線程安全的。所以在併發多線程環境下,仍然需要使用同步手段,concurrenthashMap仍然是很好的選擇。

相比於hashmap,concurrentHashmap使用了很多同步方式。
1、在初始化數組的時候,concurrentHashMap使用了cas無鎖化機制來保證了線程安全,這是一種樂觀鎖模式。
在這裏插入圖片描述
如上圖所示的initTable方法,其中該方法的細節就是如下內容:
在這裏插入圖片描述
該方法的U.compareAndSwapInt(this, SIZECTL, sc, -1)這一行代碼就是無鎖化的cas算法對table進行的初始化。

2、在put元素的時候,concurrentHashMap同樣採用了cas無鎖化機制,代碼如下:
在這裏插入圖片描述
casTabAt這一行就是在當前hash桶沒有元素的時候,將第一個元素放入桶內的代碼,此代碼依然使用了cas算法,無鎖化機制解決同步問題。

3、在所在的hash桶中有元素的時候,那麼就比較複雜了,需要遍歷整條鏈表的元素,進行put,那麼concurrenthashMap源碼爲了保證線程安全,就在這裏形成了一個同步代碼塊,這就是大名鼎鼎的分段鎖。
在這裏插入圖片描述
分段鎖降低了鎖的粒度,是一種經典的實現方式。

4、concurrentHashMap還有一點非常巧妙的處理方式,就是在實現數組擴容的時候,是不允許其他的線程put操作的,一旦有其他的線程想要進行put操作,那麼就會被逮住,拿去做苦力,幫忙進行擴容數據遷移操作。如下代碼:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章