2

我们有一个用例,我们需要获取锁并在获取锁需要超过 5 分钟时发送通知。我们仍然应该永远等待锁定。

我们正在使用可重入锁,而 lock.tryLock(5, TimeUnit.Minutes) 是不够的,因为它会在 5 分钟后出来。

我们尝试的选项是:

while(!lock.tryLock(5, TimeUnit.minutes)) {
    // send notification
}

但我想,这会导致失去锁的公平性(请求锁的顺序)

有没有人遇到过这样的用例,如果是,请解释它是如何解决的。

我们不希望在某些上下文中手动维护锁和相应的等待线程的元信息(例如何时启动以获取锁),并且另一个线程不断轮询整个上下文以查看它是否有任何等待线程等待超过 5 分钟。

4

1 回答 1

4

设置一个 ScheduledExecutorService。在获取锁之前,安排一个任务在 5 分钟内触发并保留 Future。获得锁后,取消 Future。

ScheduledExceutorService ses;
Future f = ses.schedule(new Runnable(){...}, 5, TimeUnit.Minutes);
lock.lock();
f.cancel();

如果在提交的任务执行之前获得锁,它应该被取消。

于 2011-10-11T15:05:52.497 回答