我正在尝试找出以下问题的解决方案:
public void signal(){
//resets condition and signals threads blocked below
}
public void getValue(){
waitOnCondition(); //block if a condition is not met. When signalled, all threads should proceed and get the value
//get value
resetCondition(); //reset condition, so that the next thread that executes this method blocks on the method above
}
我面临的问题似乎很简单,但我很难看到如何捕获所有边缘案例。
一个解决方案可能是将Lock
与Condition
一起使用,然后在waitOnCondition
上的所有线程都将转到await
,直到标志设置为true然后例如,继续执行signal()
的线程将使用相同的锁,将标志设置为true并signal
。然后,释放的线程将重新获取锁以将条件设置为false。但是,这并不能保证所有线程都将到达getValue点。例如:
线程1和2正在等待,获取信号。在发出信号后,线程1重新获取锁定,检查条件,现在为真,然后继续。获取值,获取锁并将条件设置为false。线程2现在看到条件仍为false,并再次阻塞。
另一个非常整洁优雅的解决方案是使用CountDownLatch
。这保证了所有线程都将继续。但是,这不可重置。还有其他想法或意见吗?
答案 0 :(得分:2)
似乎CyclicBarrier
就像你需要的那样。它是可重置的,并允许在所有各方都在那里时触发屏障操作。
Phaser
也是CyclicBarrier
的高级版本,需要JDK 7才能运行。