我有一个相对简单的问题要解决,即我想让所有线程等待某个条件发生然后继续。它可以通过以下代码解释:
void doSth(){ //shared by multiple threads
...
if(!conditionMet())
await();
//procceed further
resetCondition()
}
我不想使用锁定和条件,因为它似乎没必要。 CountDownLatch
是完美的,但我必须重置锁存器,CyclicBarrier
也不会工作,因为我不知道有多少线程需要调用等待。此外,当信号被发送到等待线程时,它们都应该被释放并继续。你们怎么会接近这个?
答案 0 :(得分:2)
我建议Phaser
我不知道有多少线程需要调用等待。
对于最终需要等待的每个线程,调用phaser.register()
[寄存器不等待,它告诉移相器期望另一个线程等待或跳过障碍物]
CountDownLatch会很完美,但我必须重置锁存器
线程完成后,调用phaser.arriveAndAwaitAdvance()
。此时,所有线程将在那里等待number of threads registered == number of threads arrived
。
答案 1 :(得分:1)
我不想使用锁定和条件,因为它似乎没必要。
为什么呢?这对我来说过早优化了。如果您不知道有多少个线程,则无法使用CountDownLatch
。在我看来,这是标准锁和条件的完美用例。我们唯一一次担心它们的使用是我们努力不让线程阻塞。但在这种情况下,阻塞正是你想要的。
答案 2 :(得分:0)
我真的不明白为什么你不想使用锁?任何“屏障”机制都会在内部使用某种形式的同步,因此没有真正“同时释放所有线程”的解决方案。
我能想到的最好:
private final Object lock = new Object();
void doSth() { //shared by multiple threads
...
synchronized(lock) {
while(!conditionMet()) {
lock.wait();
}
}
}
void release() {
synchronized(lock) {
resetCondition();
lock.notifyAll();
}
}