Уведомление о задержке получения блокировки в Java

У нас есть вариант использования, когда нам нужно получить блокировку и отправить уведомление, если получение блокировки занимает более 5 минут. Мы все еще должны ждать блокировки навсегда.

Мы используем повторные блокировки, и lock.tryLock(5, TimeUnit.Minutes) недостаточно, так как он открывается через 5 минут.

Вариант, который мы пробовали, был:

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

Но я предполагаю, что это приведет к потере справедливости блокировки (порядок, в котором блокировка была запрошена)

Сталкивался ли кто-нибудь с такими вариантами использования, если да, объясните, пожалуйста, как это решалось.

Мы предпочитаем не использовать ручное решение для поддержки блокировок и соответствующей метаинформации потока ожидания (например, когда он был инициирован для получения блокировки) в каком-то контексте, а другой поток постоянно опрашивает весь этот контекст, чтобы увидеть, есть ли в нем какие-либо потоки ожидания, ожидающие блокировки. более 5 минут.


person Ramesh    schedule 11.10.2011    source источник


Ответы (1)


Настройте ScheduledExecutorService. Прежде чем получить блокировку, запланируйте выполнение задачи через 5 минут и сохраните будущее. Когда замок будет получен, отмените Future.

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

Если вы получите блокировку до того, как отправленная задача будет выполнена, ее следует отменить.

person forty-two    schedule 11.10.2011