java.util.concurrent.CountDownLatch.countDown()
アトミックな安心感が必要です。
ブロックで呼び出しcountDown
てfinally
いるので、正しく使用していると確信しています。時折、1 つまたは 2 つの未解決のラッチが表示されることがあります。
(Javaソースコードをチェックしても確認できませんでした。)
java.util.concurrent.CountDownLatch.countDown()
アトミックな安心感が必要です。
ブロックで呼び出しcountDown
てfinally
いるので、正しく使用していると確信しています。時折、1 つまたは 2 つの未解決のラッチが表示されることがあります。
(Javaソースコードをチェックしても確認できませんでした。)
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
が壊れています。
これがデータ構造であることは明らかですjava.util.concurrent
が、Java コードAbstractQueuedSynchronizer
はアトミック操作の実装に役立つ を使用しており、キュー シンクロナイザーの API を読めば実装は非常に簡単です。それは間違いなくアトミックです:-)