Java: CountDownLatch 是线程安全的

Java: is CountDownLatch threadsafe

CountDownLatchdocs 中,我看到类似的内容:

public void run() {
      try {
        startSignal.await();
        doWork();
        doneSignal.countDown();
      } catch (InterruptedException ex) {} // return;
}

这里 startSignaldoneSignalCountDownLatch 个对象。

文档没有提及任何关于 class 是否线程安全的内容。

由于它被设计为供多个线程使用,因此可以公平地假设它线程安全的线程安全[的大多数含义。 =24=].

甚至还有一个发生在之前的承诺(来自your link):

Memory consistency effects: Until the count reaches zero, actions in a thread prior to calling countDown() happen-before actions following a successful return from a corresponding await() in another thread.

参考你的具体问题如果两个线程同时调用countDown怎么办?倒计时不就只做一次有效吗?不行,每次都会做两个countDown

class 或者更确切地说,你在 CountDownLatch 对象上调用的方法是 线程安全的 .

为了使countDown()await()这些操作线程安全,他们没有使用synchronize块或函数。相反,他们使用了 Compare and Swap 策略。 下面是证明相同的源代码

sync.releaseShared(1);

public final boolean releaseShared(int arg) {
    if (tryReleaseShared(arg)) {
        doReleaseShared();
        return true;
    }
    return false;
}

protected 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;
        }
    }

以上代码是全部实现的一部分,其他方法如await()也可以查看源码。