簡體   English   中英

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

[英]Is java.util.concurrent.CountDownLatch.countDown() atomic?

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

我在finally塊中調用countDown ,所以我確信我正確使用它。 偶爾雖然我看到一兩個優秀的鎖存器,盡管我認為應該沒有。

(我沒有設法通過檢查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調用,它使用支持AtomicInteger和許多其他類的相同Unsafe類。

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

如果它被破壞,則java.util.concurrent大部分被破壞。

它是java.util.concurrent的數據結構的事實是一個死的贈品,但Java代碼使用AbstractQueuedSynchronizer來幫助實現原子操作,並且一旦您閱讀了排隊的同步器的API,實現就非常簡單。 這絕對是原子的:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM