在我的文档中,CountDownLatch
我看到了类似的内容:
公共无效运行(){ 尝试 { startSignal.await(); 做工作(); doneSignal.countDown(); } catch (InterruptedException ex) {} // 返回; }
这里startSignal
和doneSignal
是CountDownLatch
对象。
文档没有提到该类是否是线程安全的。
在我的文档中,CountDownLatch
我看到了类似的内容:
公共无效运行(){ 尝试 { startSignal.await(); 做工作(); doneSignal.countDown(); } catch (InterruptedException ex) {} // 返回; }
这里startSignal
和doneSignal
是CountDownLatch
对象。
文档没有提到该类是否是线程安全的。
由于它被设计为由多个线程使用,因此可以公平地假设它对于thread-safe 的大多数含义都是线程安全的。
甚至还有一个发生前的承诺(来自您的链接):
内存一致性影响:在计数达到零之前,线程中的操作在调用 countDown() 之前发生在从另一个线程中的相应 await() 成功返回之后的操作。
参考您的具体问题,如果两个线程同时调用 countDown 怎么办?它不会只有效地执行一次倒计时动作吗?countDown
不,每次都会执行两个s。
是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()
。