我需要保证java.util.concurrent.CountDownLatch.countDown()
是原子的。
我在countDown
块中调用了finally
,所以我确信我正确使用它。偶尔虽然我看到一两个优秀的锁存器,尽管我认为应该没有。
(我还没有通过检查Java源代码来验证。)
答案 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。它绝对是原子的: - )