V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
amiwrong123
V2EX  ›  Java

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

  •  
  •   amiwrong123 · Aug 16, 2020 · 2014 views
    This topic created in 2091 days ago, the information mentioned may be changed or developed.

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

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

    你可以去看 happens before 规则里对 volatile 变量部分的描述.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2965 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 14:56 · PVG 22:56 · LAX 07:56 · JFK 10:56
    ♥ Do have faith in what you're doing.