3

java.util.concurrent.CountDownLatch.countDown()アトミックな安心感が必要です。

ブロックで呼び出しcountDownfinallyいるので、正しく使用していると確信しています。時折、1 つまたは 2 つの未解決のラッチが表示されることがあります。

(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クラスをサポートする同じクラスを使用する呼び出し。AtomicInteger

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 に答える