我们有一个用例,我们需要获取一个锁,如果获取锁花费的时间超过5分钟,则发送通知。我们应该永远等着那把锁。
我们使用的是重入锁,lock.tryLock(5,TimeUnit.Minutes)是不够的,因为它会在5分钟后出来。
我们尝试的选项是:
while(!lock.tryLock(5, TimeUnit.minutes)) {
// send notification
}但我猜,这将导致失去锁的公平性(请求锁的顺序)
有没有人遇到过这样的用例,如果有,请解释是如何解决的。
我们不喜欢在某些上下文中手动维护锁和相应等待线程的元信息(例如,当它被启动以获取锁时),而另一个线程不断轮询整个上下文,以查看是否有等待线程等待超过5分钟。
发布于 2011-10-11 23:05:52
设置ScheduledExecutorService。在获取锁之前,计划一个任务在5分钟内触发并保存未来。获取锁后,取消Future。
ScheduledExceutorService ses;
Future f = ses.schedule(new Runnable(){...}, 5, TimeUnit.Minutes);
lock.lock();
f.cancel();如果您在提交的任务执行之前获取了锁,则应取消该锁。
https://stackoverflow.com/questions/7727859
复制相似问题