您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)java中怎么使用HashMap與ConcurrentHashMap實(shí)現(xiàn)高并發(fā),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
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)。
上面是單線程下reHash的擴(kuò)容步驟。
在多線程情況下:
數(shù)據(jù)結(jié)構(gòu):
看完上述內(nèi)容,你們對java中怎么使用HashMap與ConcurrentHashMap實(shí)現(xiàn)高并發(fā)有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(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)容。