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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

ConcurrentHashMap的源码分析-put方法第三阶段

發(fā)布時(shí)間:2024/4/13 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ConcurrentHashMap的源码分析-put方法第三阶段 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

如果對(duì)應(yīng)的節(jié)點(diǎn)存在,判斷這個(gè)節(jié)點(diǎn)的hash是不是等于MOVED(-1),說(shuō)明當(dāng)前節(jié)點(diǎn)是ForwardingNode節(jié)點(diǎn),意味著有其他線(xiàn)程正在進(jìn)行擴(kuò)容,那么當(dāng)前現(xiàn)在直接幫助它進(jìn)行擴(kuò)容,因此調(diào)用helpTransfer方法
?

else if ((fh = f.hash) == MOVED) tab = helpTransfer(tab, f);

helpTransfer

從名字上來(lái)看,代表當(dāng)前是去協(xié)助擴(kuò)容

final Node<K,V>[] helpTransfer(Node<K,V>[] tab, Node<K,V> f) { Node<K,V>[] nextTab; int sc; // 判斷此時(shí)是否仍然在執(zhí)行擴(kuò)容,nextTab=null的時(shí)候說(shuō)明擴(kuò)容已經(jīng)結(jié)束了 if (tab != null && (f instanceof ForwardingNode) && (nextTab = ((ForwardingNode<K,V>)f).nextTable) != null) { int rs = resizeStamp(tab.length);//生成擴(kuò)容戳 while (nextTab == nextTable && table == tab && (sc = sizeCtl) < 0) {//說(shuō)明擴(kuò)容還未完成的情況下不斷循環(huán)來(lái)嘗試將當(dāng)前線(xiàn)程加入到擴(kuò)容操作中 //下面部分的整個(gè)代碼表示擴(kuò)容結(jié)束,直接退出循環(huán)//transferIndex<=0表示所有的Node都已經(jīng)分配了線(xiàn)程 //sc=rs+MAX_RESIZERS 表示擴(kuò)容線(xiàn)程數(shù)達(dá)到最大擴(kuò)容線(xiàn)程數(shù)//sc >>> RESIZE_STAMP_SHIFT !=rs, 如果在同一輪擴(kuò)容中,那么sc無(wú)符號(hào)右移比較高位和rs的值,那么應(yīng)該是相等的。如果不相等,說(shuō)明擴(kuò)容結(jié)束了 //sc==rs+1 表示擴(kuò)容結(jié)束 if ((sc >>> RESIZE_STAMP_SHIFT) != rs || sc == rs + 1 || sc == rs + MAX_RESIZERS || transferIndex <= 0) break;//跳出循環(huán) if (U.compareAndSwapInt(this, SIZECTL, sc, sc + 1)) {//在低16位上增加擴(kuò)容線(xiàn)程數(shù) transfer(tab, nextTab);//幫助擴(kuò)容 break; } } return nextTab; } return table;//返回新的數(shù)組 }

?

總結(jié)

以上是生活随笔為你收集整理的ConcurrentHashMap的源码分析-put方法第三阶段的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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