在我的应用程序中,发生了两件事:
- 各种线程产生工作。
- 有一个函数(但不是 1 个持续运行的线程)消耗这些作业。此功能由生产者启动,但被锁定,因此它只运行一次。
例如,生成了一个作业:
addJobToDatabase(...);
triggerPass();
这就是消费者功能的启动方式:
public void triggerPass() {
// prevent running more than once
if (onceLock.tryLock()) { // onceLock is a ReentrantLock
try {
while (haveJobs()) {
doJobs();
}
} finally {
onceLock.unlock();
}
} else {
log.info("Pass triggered, but already running");
}
}
现在,这里可能存在一个很小的竞争条件。如果
- 线程 A 已离开
while
但尚未完成onceLock.unlock()
- 线程 B 会
onceLock.tryLock()
返回 false
...线程 B 的作业直到稍后调用 triggerPass(); 才会执行;
虽然我怀疑它会在实践中给我带来麻烦,但这个小差距可以为了正确性而缩小吗?