java.util.concurrent.CountDownLatch.countDown()是原子的吗?

时间:2013-06-06 15:28:11

标签: java concurrency

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

我在countDown块中调用了finally,所以我确信我正确使用它。偶尔虽然我看到一两个优秀的锁存器,尽管我认为应该没有。

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

2 个答案:

答案 0 :(得分: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和其他许多类的AtomicInteger类。

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

如果它被破坏,那么java.util.concurrent的很大一部分都会被破坏。

答案 1 :(得分:0)

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