ConcurrentHashMap的源码分析-put方法第三阶段
生活随笔
收集整理的這篇文章主要介紹了
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方法
?
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)題。
- 上一篇: ConcurrentHashMap的源码
- 下一篇: 接口调试利器Postman