ConcurrentHashMap的源码分析-put方法第三阶段
生活随笔
收集整理的這篇文章主要介紹了
ConcurrentHashMap的源码分析-put方法第三阶段
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
如果對應的節點存在,判斷這個節點的hash是不是等于MOVED(-1),說明當前節點是ForwardingNode節點,意味著有其他線程正在進行擴容,那么當前現在直接幫助它進行擴容,因此調用helpTransfer方法
?
helpTransfer
從名字上來看,代表當前是去協助擴容
final Node<K,V>[] helpTransfer(Node<K,V>[] tab, Node<K,V> f) { Node<K,V>[] nextTab; int sc; // 判斷此時是否仍然在執行擴容,nextTab=null的時候說明擴容已經結束了 if (tab != null && (f instanceof ForwardingNode) && (nextTab = ((ForwardingNode<K,V>)f).nextTable) != null) { int rs = resizeStamp(tab.length);//生成擴容戳 while (nextTab == nextTable && table == tab && (sc = sizeCtl) < 0) {//說明擴容還未完成的情況下不斷循環來嘗試將當前線程加入到擴容操作中 //下面部分的整個代碼表示擴容結束,直接退出循環//transferIndex<=0表示所有的Node都已經分配了線程 //sc=rs+MAX_RESIZERS 表示擴容線程數達到最大擴容線程數//sc >>> RESIZE_STAMP_SHIFT !=rs, 如果在同一輪擴容中,那么sc無符號右移比較高位和rs的值,那么應該是相等的。如果不相等,說明擴容結束了 //sc==rs+1 表示擴容結束 if ((sc >>> RESIZE_STAMP_SHIFT) != rs || sc == rs + 1 || sc == rs + MAX_RESIZERS || transferIndex <= 0) break;//跳出循環 if (U.compareAndSwapInt(this, SIZECTL, sc, sc + 1)) {//在低16位上增加擴容線程數 transfer(tab, nextTab);//幫助擴容 break; } } return nextTab; } return table;//返回新的數組 }?
總結
以上是生活随笔為你收集整理的ConcurrentHashMap的源码分析-put方法第三阶段的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ConcurrentHashMap的源码
- 下一篇: 接口调试利器Postman