Может ли куратор Apache InterProcessSemaphoreMutex выпускать когда-нибудь?

Я использую приведенный ниже рецепт в нашем коде, чтобы обеспечить одноэлементное приложение JVM

 public void acquireLock(InterProcessSemaphoreMutex lock){
   lock.acquire();
 }

 public void releaseLock(InterProcessSemaphoreMutex lock){
      lock.release();
 }

Я снимаю блокировку (посредством вызова функции выше) в 2 условиях:

  1. Работа сделана.
  2. Я получил потерянное изменение состояния от куратора.

Возможно ли, что вызов release() может зависнуть?
Также я должен добавить ниже предикат в releaseLock()?

if (lock.isAcquiredInThisProcess()) {
    lock.release();
}

1 ответ

(Примечание: я главный автор куратора)

Если вы в данный момент не подключены (то есть в состоянии SUSPENDED/LOST), то lock.release() будет зависать на основе вашей текущей политики повторных попыток. Однако он не будет зависать бесконечно и вернется после того, как попытки будут исчерпаны. Что еще более важно, внутренне куратор гарантирует, что узел, связанный с блокировкой / семафором, будет удален, поэтому вы всегда должны вызывать этот метод, если вы собираетесь снять блокировку / семафор. После восстановления соединения узел будет удален, и другие процессы, ожидающие получения, могут продолжить работу.

Другие вопросы по тегам