java map扩容机制_java中ConcurrentHashMap的扩容机制是怎样的?详细解析
大家都知道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)容,希望文章能夠幫你解決所遇到的問題。