跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 为什么 ConcurrentHashMap1.8 的扩容操作,最后一个完成任务的线程,还要再扫查一遍每个哈希桶呢?
未分類
21 7 月 2020

为什么 ConcurrentHashMap1.8 的扩容操作,最后一个完成任务的线程,还要再扫查一遍每个哈希桶呢?

为什么 ConcurrentHashMap1.8 的扩容操作,最后一个完成任务的线程,还要再扫查一遍每个哈希桶呢?

資深大佬 : amiwrong123 4

            if (i < 0 || i >= n || i + n >= nextn) {                 int sc;                 if (finishing) {                     nextTable = null;                     table = nextTab;                     sizeCtl = (n << 1) - (n >>> 1);                     return;                 }                 if (U.compareAndSwapInt(this, SIZECTL, sc = sizeCtl, sc - 1)) {                     if ((sc - 2) != resizeStamp(n) << RESIZE_STAMP_SHIFT)                         return;                     //执行到这里,说明当前线程是最后一个归还许可的线程                     finishing = advance = true;//finishing 为 true,再次扫查                     i = n; // 把遍历指针设置为 n,再从尾到头扫查一遍                 }             } 

transfer 函数里有这么一段代码,它让最后一个归还 sizeCtl 线程数的那个线程再做一遍扫查,但既然当前线程都已经是最后一个归还 sizeCtl 线程数那个线程,说明每个线程包括自己都已经完成了自己领取的 transfer 任务了,那不就没必要再从尾到头扫查一遍了吗?

还是我遗漏了什么情况

大佬有話說 (0)

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具