9

在我的文档中,CountDownLatch我看到了类似的内容:

公共无效运行(){
      尝试 {
        startSignal.await();
        做工作();
        doneSignal.countDown();
      } catch (InterruptedException ex) {} // 返回;
}

这里startSignaldoneSignalCountDownLatch对象。

文档没有提到该类是否是线程安全的。

4

2 回答 2

7

由于它被设计为由多个线程使用,因此可以公平地假设它对于thread-safe 的大多数含义都是线程安全的

甚至还有一个发生前的承诺(来自您的链接):

内存一致性影响:在计数达到零之前,线程中的操作在调用 countDown() 之前发生在从另一个线程中的相应 await() 成功返回之后的操作。

参考您的具体问题,如果两个线程同时调用 countDown 怎么办?它不会只有效地执行一次倒计时动作吗?countDown不,每次都会执行两个s。

于 2015-05-06T11:05:26.897 回答
0

CountDownLatch的,您在对象 arr thread-safe上调用的类或更确切地说是方法。

为了使这些操作如countDown() await()线程安全,它们没有使用synchronize块或函数。相反,他们使用了比较和交换策略。以下是证明相同的源代码

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()

于 2018-05-28T08:32:50.603 回答