Java并发-离开方法后重置条件

标签 java multithreading locking countdownlatch

我正在尝试找出以下问题的解决方案:

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

}

我面临的问题似乎很简单,但我正在努力了解如何捕获所有边缘情况。

一种解决方案可能是将LockCondition一起使用,然后所有在waitOnCondition上运行的线程都将await<例如, 直到标志设置为 true,然后继续。然后,执行 signal() 的线程将使用相同的锁,将标志设置为 true 并设置 signal。然后,被释放的线程将重新获取锁以将条件设​​置为 false。然而,这并不能保证所有线程都会到达 getValue 点。例如:

线程1和2正在等待,获取信号。收到信号后,线程 1 重新获取锁,检查条件(现在为真),然后继续。获取值,获取锁并将条件设置为 false。线程 2 现在发现条件仍然为 false,并再次阻塞。

另一个非常简洁优雅的解决方案是使用 CountDownLatch。这保证了所有线程都会继续进行。然而,这是不可重置的。还有其他想法或意见吗?

最佳答案

看起来像CyclicBarrier就是你所需要的。它是可重置的,并且还允许在所有各方都在场时触发屏障操作。

还有Phaser这是 CyclicBarrier 的高级版本,需要 JDK 7 才能运行。

关于Java并发-离开方法后重置条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20658805/

相关文章:

java - 字符串中的 NullPointerException

java - 有没有类似 LINQPad for Java 的程序? (不是重复的!)

C#:为迭代正确锁定队列

java - JavaFX-Launcher 中的循环阻止 JavaFX 应用程序线程启动

java - 具有批量和刷新功能的生产者/消费者

python - 如何在 Django 中执行表/行锁

java - 演示 ReadWriteLock 用法的示例

java - 不使用数组查找给定整数的第二大数目

java - 使用 setText 清除 TextField 的内容在 AWT 中不起作用

c++ - 我应该在 openMP 并行区域内使用 gnu 并行模式功能吗(for 循环,任务)