Java 带连接的防护块
我需要通过几个线程进行同步。我不创建线程,但我知道有多少线程。所以我写了这个内部防护块:Java 带连接的防护块,java,multithreading,join,guard,Java,Multithreading,Join,Guard,我需要通过几个线程进行同步。我不创建线程,但我知道有多少线程。所以我写了这个内部防护块: private class Guard { int waiters = 0; boolean wait; synchronized void addWaiter() { ++waiters; wait = true; while (wait && waiters != threadNum()) {
private class Guard {
int waiters = 0;
boolean wait;
synchronized void addWaiter() {
++waiters;
wait = true;
while (wait && waiters != threadNum()) {
try {
wait();
} catch (InterruptedException e) {}
}
waiters = 0;
wait = false;
notifyAll();
}
}
此受保护的块在循环中执行。所以问题是,在第一次调用的所有线程从wait()
循环中释放之前,它可能会被第二次调用,这显然会破坏整个保护逻辑。因此,我需要在线程从保护中释放之前以某种方式连接线程。有这样的设计吗?实现它最优雅的方式是什么。请记住,线程不是由我创建的
谢谢。听起来像是一份工作。您可以将闩锁设置为等待N次倒计时。有关示例,请参阅Javadoc。听起来像是一份工作。您可以将闩锁设置为等待N次倒计时。有关示例,请参见Javadoc。Aha!!应该如此。我重新发明了轮子。不幸的是,它是方形的。轮胎公司一直在重新发明车轮,但那是他们的工作。我倾向于把并发问题留给专家来解决作为旁注,在这种情况下,CyclicBarrier似乎是一个更好的候选人。它是CountDownLatch的可重用的表亲。为了继续delmet的类比,Java 7将与Phaser一起推出,它是CountDownLatch和cyclicbarrier的后代:)啊哈!!应该如此。我重新发明了轮子。不幸的是,它是方形的。轮胎公司一直在重新发明车轮,但那是他们的工作。我倾向于把并发问题留给专家来解决作为旁注,在这种情况下,CyclicBarrier似乎是一个更好的候选人。它是CountDownLatch的可重用的表亲。为了继续delmet的类比,Java 7将推出Phaser,它是CountDownLatch和cyclicbarrier的后代:)