3

java.util.concurrent.CountDownLatch.countDown()我需要原子性的保证。

我正在调用块countDownfinally所以我确信我正确使用它。尽管我认为应该没有,但偶尔会看到一两个出色的闩锁。

(我还没有通过检查 Java 源代码来验证。)

4

2 回答 2

4

我需要保证 java.util.concurrent.CountDownLatch.countDown() 是原子的。

我向你保证,它绝对是原子的。如果不是,这将是一个严重的错误。如果您调试代码,我希望您会发现代码问题。

(我还没有通过检查 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支持 theAtomicInteger和许多其他类的相同类。

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

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

于 2013-06-06T15:36:41.357 回答
0

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

于 2013-06-06T15:43:03.790 回答