我正在努力为我的用例
找到正确的Java线程同步机制答案 0 :(得分:3)
ReentrantReadWriteLock
的 java.util.concurrent.locks
符合您的需求。
读写锁允许更高级别的并发性 访问共享数据而不是互斥锁允许的数据。 它利用了这样一个事实,即一次只有一个线程(a writer线程)可以修改共享数据,在很多情况下可以任意数量 线程可以同时读取数据(因此读取器线程)。
工作线程应该使用ReadLock
和“over-seer”线程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;
}
}
答案 1 :(得分:0)
您可以使用Semaphore来保护工作流,该{{3}}使用与池中的线程相同的许可数进行初始化。如果一个线程想要开始处理工作流,它必须获得许可。
正在配置工作流程的主线程" drains"获取所有许可证的信号量。为了使其可靠地工作,您必须创建信号量为“公平”#34;。这会对性能产生影响,但会提供工作线程无法跳转到另一轮处理,即使主线程已经从信号量请求了所有许可。由于主线程现在拥有所有许可,您的工作线程将等待许可变为可用,以便它们可以继续。
主线程完成后,显然必须释放它获得的所有许可。