V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
amiwrong123
V2EX  ›  Java

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

  •  
  •   amiwrong123 · 2020-08-16 23:57:14 +08:00 · 1564 次点击
    这是一个创建于 1369 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 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 条回复    2020-08-17 13:16:58 +08:00
    BBCCBB
        1
    BBCCBB  
       2020-08-17 08:31:43 +08:00   ❤️ 1
    手里的 jdk11 实现已经不是这个 putOrderedInt 了.
    不过我感觉套路都差不多, 就是要么是在加锁里面执行的, 要么是有 volatile 字段更新, 捎带就把他的缓存给清了.
    BBCCBB
        2
    BBCCBB  
       2020-08-17 08:32:14 +08:00
    amiwrong123
        3
    amiwrong123  
    OP
       2020-08-17 10:43:06 +08:00
    @BBCCBB
    volatile 变量的修改可以立刻让所有的线程可见,这个确实很好理解,对于同一个字段来说。

    但其实,对 A 字段的 CAS 写操作,可以让其他所有字段的普通写操作,也马上可见。我这么理解对不
    BBCCBB
        4
    BBCCBB  
       2020-08-17 13:16:58 +08:00
    @amiwrong123 就我了解来说, 你的理解是对的, 这也是一个捎带同步的技巧..

    你可以去看 happens before 规则里对 volatile 变量部分的描述.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6065 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:50 · PVG 09:50 · LAX 18:50 · JFK 21:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.