【发布时间】:2019-09-06 09:05:49
【问题描述】:
我有很多线程来监控某个状态。如果应用程序进入该状态,那么我需要做一些额外的工作。我想只允许 1 个线程执行它,并希望阻止其他线程,直到该工作完成。阻塞意味着他们不能再次执行该任务。
我有以下场景:
ReentrantLock lock = new ReentrantLock
void doSomething() {
if (lock.tryLock()) {
try {
doSomeWork()
} finally {
lock.unLock()
}
} else {
// wait for DoSomeWork is done
}
}
我可以在循环中监视lock.isLocked(),但实际上我只是想等到另一个线程完成工作。
【问题讨论】:
-
您的问题到底是什么?您可以使用
lock.lock(),它将等待锁被释放并保证在给定时间只有一个线程拥有它,这不是您想要的吗? -
啊,是的,不知何故,我只是把它复杂化了。拥有
try {lock.lock() } finally {lock.unlock()}将解决问题
标签: java concurrency java.util.concurrent