Java: CountDownLatch 是线程安全的
Java: is CountDownLatch threadsafe
在 CountDownLatch
的 docs 中,我看到类似的内容:
public void run() {
try {
startSignal.await();
doWork();
doneSignal.countDown();
} catch (InterruptedException ex) {} // return;
}
这里 startSignal
和 doneSignal
是 CountDownLatch
个对象。
文档没有提及任何关于 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()
也可以查看源码。
在 CountDownLatch
的 docs 中,我看到类似的内容:
public void run() { try { startSignal.await(); doWork(); doneSignal.countDown(); } catch (InterruptedException ex) {} // return; }
这里 startSignal
和 doneSignal
是 CountDownLatch
个对象。
文档没有提及任何关于 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()
也可以查看源码。