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

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • FutureTask 里使用普通语义而不是 CAS 写的原因是?
未分類
3 9 月 2020

FutureTask 里使用普通语义而不是 CAS 写的原因是?

FutureTask 里使用普通语义而不是 CAS 写的原因是?

資深大佬 : amiwrong123 20

在 FutureTask 里面,普通写和 CAS 写是 混合使用的。比如

    public boolean cancel(boolean mayInterruptIfRunning) {         if (!(state == NEW &&               UNSAFE.compareAndSwapInt(this, stateOffset, NEW,                   mayInterruptIfRunning ? INTERRUPTING : CANCELLED)))             return false;         try {    // in case call to interrupt throws exception             if (mayInterruptIfRunning) {                 try {                     Thread t = runner;                     if (t != null)                         t.interrupt();                 } finally { // final state                     UNSAFE.putOrderedInt(this, stateOffset, INTERRUPTED);  //这里是普通写语义                 }             }         } finally {             finishCompletion();         }         return true;     } 

我这么解释对吗:

  • 一来,这个状态转移是唯一的。INTERRUPTING 只能变成 INTERRUPTED 。其他线程暂时看不到 INTERRUPTED 也没关系。(注意,暂时看不到 INTERRUPTING,会导致 handlePossibleCancellationInterrupt 自旋)
  • 二来。由于 finishCompletion 有其他的 CAS 操作,执行了 CAS 操作就相当于强制刷新了内存,所以只要 finishCompletion 执行了 CAS,那么其他线程也就能看到 INTERRUPTED 这个状态了。
大佬有話說 (4)

  • 資深大佬 : BBCCBB

    手里的 jdk11 实现已经不是这个 putOrderedInt 了.
    不过我感觉套路都差不多, 就是要么是在加锁里面执行的, 要么是有 volatile 字段更新, 捎带就把他的缓存给清了.

  • 資深大佬 : BBCCBB

    https://blog.csdn.net/ITer_ZC/article/details/40744485

    可以看看这个.

  • 主 資深大佬 : amiwrong123

    @BBCCBB
    volatile 变量的修改可以立刻让所有的线程可见,这个确实很好理解,对于同一个字段来说。

    但其实,对 A 字段的 CAS 写操作,可以让其他所有字段的普通写操作,也马上可见。我这么理解对不

  • 資深大佬 : BBCCBB

    @amiwrong123 就我了解来说, 你的理解是对的, 这也是一个捎带同步的技巧..

    你可以去看 happens before 规则里对 volatile 变量部分的描述.

文章導覽

上一篇文章
下一篇文章

AD

其他操作

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

51la

4563博客

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