我很难为用例找到正确的Java线程同步机制
有人能说出第三步是如何实现的吗?

发布于 2016-04-16 12:14:36
来自java.util.concurrent.locks的java.util.concurrent.locks将适合您的需要。
读写锁允许在访问共享数据时比互斥锁所允许的并发性更高。它利用了这样一个事实:一次只有一个线程(编写线程)可以修改共享数据,但在许多情况下,任意数量的线程都可以并发读取数据(因此是读取器线程)。
工作线程应该使用ReadLock和“监控程序”线程WriteLock。在重新配置工作流时,写锁会阻塞读取器。
下面是示例代码
import java.util.concurrent.locks.ReentrantReadWriteLock;
class Workflow {
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
public void updateWorkflowConfig() {
this.rwl.writeLock().lock();
try {
// do smth
} finally {
this.rwl.writeLock().unlock();
}
}
public Work takeWorkFromWorkflow() {
Work result = null;
this.rwl.readLock().lock();
try {
result = //...
} finally {
this.rwl.readLock().unlock();
}
return result;
}
}发布于 2016-04-16 10:34:03
您可以使用一个信号量来保护工作流,它使用相同数量的许可初始化,就像池中有线程一样。如果一个线程想要开始处理工作流,它必须获得许可。
配置工作流的主线程通过获取所有许可“耗尽”信号量。要使它可靠地工作,您必须创建信号量才能做到“公平”。这对性能有影响,但将提供工作线程不能跳入另一轮处理,即使主线程已经请求信号量的所有许可。由于主线程现在持有所有许可,因此您的工作线程都将等待许可变为可用,以便它们可以继续使用。
一旦主线程完成,显然它必须释放它所获得的所有许可。
https://stackoverflow.com/questions/36662266
复制相似问题