溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java中怎么使用HashMap與ConcurrentHashMap實(shí)現(xiàn)高并發(fā)

發(fā)布時(shí)間:2021-08-03 13:49:17 來源:億速云 閱讀:136 作者:Leah 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(guān)java中怎么使用HashMap與ConcurrentHashMap實(shí)現(xiàn)高并發(fā),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

HashMap

java中怎么使用HashMap與ConcurrentHashMap實(shí)現(xiàn)高并發(fā)

HashMap底層就是一個(gè)數(shù)組,而數(shù)組的每一項(xiàng)都是一個(gè)鏈表,當(dāng)我們新建一個(gè)HashMap時(shí)就會(huì)初始化一個(gè)數(shù)組。HashMap有兩個(gè)參數(shù)影響性能,分別是初始容量和加載因子。 

HashMap尋址方式:對于一個(gè)新插入的數(shù)據(jù)或者需要讀取的數(shù)據(jù),HashMap需要根據(jù)key按照一個(gè)計(jì)算規(guī)則計(jì)算出Hash值并對我們的數(shù)組長度進(jìn)行取模,取模結(jié)果作為數(shù)組的index,而取模的代價(jià)遠(yuǎn)遠(yuǎn)高于位運(yùn)算的代價(jià),因此HashMap的數(shù)組長度必須是2的N次方,將計(jì)算出的Hash值和2的N-1次方進(jìn)行“與”運(yùn)算,結(jié)果與取模操作是相同的。

HashMap并不要求用戶在指定HashMap容量時(shí)必須傳入一個(gè)2的N次方的整數(shù),而是在初始化時(shí)根據(jù)傳入的容量值計(jì)算出一個(gè)滿足2的N次方的容量。

總所周知HashMap不是一個(gè)線程安全的,主要體現(xiàn)在執(zhí)行resize方法時(shí)可能會(huì)產(chǎn)生死循環(huán),當(dāng)HashMap的size超過他的容量*負(fù)載因子時(shí),就需要對HashMap擴(kuò)容,具體方法是創(chuàng)建一個(gè)新的原來容量的兩倍的數(shù)組(保證新的容量仍然是2的N次方,從而保證上述的尋址方式仍然適用),同時(shí)把原來的數(shù)組重新插入到新的數(shù)組中,這一過程并不保證線程安全,而且在多線程并發(fā)調(diào)用時(shí)可能會(huì)產(chǎn)生死循環(huán)。

java中怎么使用HashMap與ConcurrentHashMap實(shí)現(xiàn)高并發(fā)

上面是單線程下reHash的擴(kuò)容步驟。

在多線程情況下:

java中怎么使用HashMap與ConcurrentHashMap實(shí)現(xiàn)高并發(fā)

ConcurrentHashMap

數(shù)據(jù)結(jié)構(gòu):

java中怎么使用HashMap與ConcurrentHashMap實(shí)現(xiàn)高并發(fā)

java中怎么使用HashMap與ConcurrentHashMap實(shí)現(xiàn)高并發(fā)

看完上述內(nèi)容,你們對java中怎么使用HashMap與ConcurrentHashMap實(shí)現(xiàn)高并發(fā)有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI