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` 还有很多其他的课程。
2条答案
按热度按时间ckocjqey1#
事实上,它是
java.util.concurrent
是一个死赠品,但java代码使用AbstractQueuedSynchronizer
这有助于实现原子操作,一旦您阅读了排队同步器的api,实现就非常简单了。绝对是原子的:-)xriantvc2#
我需要确保java.util.concurrent.countdownlatch.countdown()是原子的。
我向你保证,它绝对是原子弹。如果不是这样的话,它将是一个关键的bug。我希望你会发现你的代码问题,如果你调试你的代码。
(我还没有通过检查java源代码来验证。)
以下是代码跟踪:
默认实现
sync
是:return unsafe.compareAndSwapInt(this, stateOffset, expect, update);