我们有一个用例,如果获取锁定超过5分钟,我们需要获取锁并发送通知。我们应该永远等待锁定。
我们正在使用重入锁和lock.tryLock(5,TimeUnit.Minutes)是不够的,因为它在5分钟后出现。
我们尝试的选项是:
while(!lock.tryLock(5, TimeUnit.minutes)) {
// send notification
}
但我想,这会导致失去锁定的公平性(请求锁定的顺序)
有没有人面对这样的用例,如果是,请解释它是如何解决的。
我们不希望在某些上下文中使用手动解决方案来维护锁和相应的等待线程的元信息(如启动锁定获取时),另一个线程不断轮询整个上下文以查看是否有任何等待线程等待超过5分钟。
答案 0 :(得分:4)
设置ScheduledExecutorService。在获得锁定之前,安排任务在5分钟内启动并保留未来。获取锁定后,取消Future。
ScheduledExceutorService ses;
Future f = ses.schedule(new Runnable(){...}, 5, TimeUnit.Minutes);
lock.lock();
f.cancel();
如果在执行提交的任务之前获得锁定,则应取消锁定。