java.util.concurrent.countdownlatch.countdown()是原子的吗?

rjee0c15  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(278)

我需要保证 java.util.concurrent.CountDownLatch.countDown() 是原子的。
我打电话来 countDownfinally 所以我有信心我使用它是正确的。偶尔,尽管我看到一两个突出的闩锁,尽管我认为应该没有。
(我还没有通过检查java源代码来验证。)

ckocjqey

ckocjqey1#

事实上,它是 java.util.concurrent 是一个死赠品,但java代码使用 AbstractQueuedSynchronizer 这有助于实现原子操作,一旦您阅读了排队同步器的api,实现就非常简单了。绝对是原子的:-)

xriantvc

xriantvc2#

我需要确保java.util.concurrent.countdownlatch.countdown()是原子的。
我向你保证,它绝对是原子弹。如果不是这样的话,它将是一个关键的bug。我希望你会发现你的代码问题,如果你调试你的代码。
(我还没有通过检查java源代码来验证。)
以下是代码跟踪:

public void countDown() {
    sync.releaseShared(1);
}

默认实现 sync 是:

public boolean tryReleaseShared(int releases) {
        // Decrement count; signal when transition to zero
        for (;;) {
            int c = getState();
            if (c == 0)
                return false;
            int nextc = c-1;
            if (compareAndSetState(c, nextc))
                return nextc == 0;
        }
    }
``` `compareAndSetState` 使用相同 `Unsafe` 支持 `AtomicInteger` 还有很多其他的课程。

return unsafe.compareAndSwapInt(this, stateOffset, expect, update);

如果它坏了,那么大部分 `java.util.concurrent` 都坏了。

相关问题