關於Java中的ConcurrentHashMap的實現原理有大神可以詳細介紹下嗎?

時間 2021-05-12 06:21:50

1樓:meteor

2樓:the張

1.7陣列+hashmap,cas+rentrantlock

分段鎖1.8陣列+鍊錶+紅黑樹,synchronized+cas

優化版的hashmap

3樓:luoxn28

可以看下這個:

4樓:mmwx

沒人講1.8版,那我來講講吧。

1.8版本相比1.7版本,沒有了分段鎖的概念,轉而使用cas和synchronized鎖,底層資料結構也不太一樣。

資料結構:陣列加鍊表或紅黑樹,陣列每個位置要麼是鍊錶,要麼是紅黑樹。

同步方法:cas+synchronized鎖加鎖物件:陣列每個位置的頭節點

put方法:先hash定位桶位置,cas操作獲取該位置頭節點,接著使用synchronized鎖鎖住頭節點,進行put操作。

get方法:hash定位,遍歷鍊錶或者紅黑樹,獲取節點。

擴容操作:

什麼情況會導致擴容?

1.鍊錶轉換為紅黑樹時(鍊錶節點個數達到8個可能會轉換為紅黑樹),table陣列長度小於64。

2.陣列中總節點數大於閾值(陣列長度的0.75倍)如何擴容?

1.單執行緒建立乙個新的table,是原先table的兩倍。

2.多執行緒併發協作,共同複製舊的table到新的table中。

5樓:Edison Tian

如果沒記錯的話,是用到了一種叫鎖分段技術,具體你可以查一下,相對於hashtable ,concurrenthahmap加了16把鎖,也就是說當你對第乙個值操作時,只會鎖住前兩個值,而其他值不受影響。從而由原先競爭1把鎖,變成競爭16把鎖,所以效能會很高!

關於java中throw的疑問?

逗泥丸的平方 你太難為人家了,你知道函式必然異常,但是編譯器只能知道函式宣告了異常。就好像你寫if true,當然現在ide也會提示你,但是這的確沒有也沒必要成為語法錯誤 蔣繼發 你在 Code 中執行 throw new Exception,編譯器在語法檢查階段就確定了第 8 行無法到達,所以提示...

請問關於java中list size 0的問題?

說個故事吧,曾經國內某一線網際網路公司做活動送小禮品,判斷禮品剩餘數量 0則活動結束,結果因為併發問題,禮品剩餘數量直接成了負數。事後想來,當初寫成 0該多好。 陳毅 首先想問下這個判定條件是在什麼情況下使用 補充下,其他同學說的很有道理。稍微做個補充,判斷list.size 0 是做出了防禦性程式...

關於java中物件和泛型的乙個小問題?

第二個問題,第一種情況是因為String是Object的子類,所以可以。第二種,你new出來的list1是Object集合,說明裡面可以放任何型別,要是能等於String集合,不就只能放String 了麼,所以報錯了。第乙個不了解,應該是乙個吧。下班路上手機打字應該不嚴謹,一會更新 1 就new O...