日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java map扩容机制_java中ConcurrentHashMap的扩容机制是怎样的?详细解析

發(fā)布時間:2023/12/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java map扩容机制_java中ConcurrentHashMap的扩容机制是怎样的?详细解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

大家都知道java中有很多的基礎(chǔ)知識,需要大家花費一定的時間去消化。關(guān)于java中ConcurrentHashMap

的擴容機制不知道大家是否了解過,其實內(nèi)容也是很好理解的,一起來看看吧。

首先,我們需要知道的是:

1. 計算每個線程可以處理的桶區(qū)間。默認(rèn) 16.

2. 初始化臨時變量nextTable,擴容 2 倍。

3. 死循環(huán),計算下標(biāo)。完成總體判斷。

4. 如果桶內(nèi)有數(shù)據(jù),同步轉(zhuǎn)移數(shù)據(jù)。通常會像鏈表拆成2份。

然后來看一下,java中ConcurrentHashMap的擴容機制是怎樣的?

它的大體思想就是遍歷、復(fù)制的過程。首先根據(jù)運算得到需要遍歷的次數(shù)i,然后利用tabAt方法獲得i位置的元素:

如果這個位置為空,就在原table中的i位置放入forwardNode節(jié)點,這個也是觸發(fā)并發(fā)擴容的關(guān)鍵點;

如果這個位置是Node節(jié)點(fh>=0),如果它是一個鏈表的頭節(jié)點,就構(gòu)造一個反序鏈表,把他們分別放在nextTable的i和i+n的位置上

如果這個位置是TreeBin節(jié)點(fh<0),也做一個反序處理,并且判斷是否需要untreefi,把處理的結(jié)果分別放在nextTable的i和i+n的位置上

遍歷過所有的節(jié)點以后就完成了復(fù)制工作,這時讓nextTable作為新的table,并且更新sizeCtl為新容量的0.75倍 ,完成擴容。

最后說一下,多線程是如何完成的:

如果遍歷到的節(jié)點是forward節(jié)點,就向后繼續(xù)遍歷,再加上給節(jié)點上鎖的機制,就完成了多線程的控制。多線程遍歷節(jié)點,處理了一個節(jié)點,就把對應(yīng)點的值set為forward,另一個線程看到forward,就向后遍歷。這樣交叉就完成了復(fù)制工作。

上述的內(nèi)容是不是很好理解呢?其實java中像這樣的基礎(chǔ)知識還是有很多的,具體的就需要大家自己去了解和學(xué)習(xí)了。想要了解更多java基礎(chǔ)知識,敬請關(guān)注奇Q工具網(wǎng)。

推薦閱讀:

總結(jié)

以上是生活随笔為你收集整理的java map扩容机制_java中ConcurrentHashMap的扩容机制是怎样的?详细解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。