Снять блокировки при сбое в Java - PullRequest
2 голосов
/ 21 сентября 2011

Я пишу клиент-серверное приложение, используя Java-RMI. К некоторым ресурсам на стороне сервера нужно обращаться по взаимному исключению (для этого я использую блокировки).

Теперь мне было интересно, что произойдет, когда:

  1. Клиент вызывает удаленный метод на сервере
  2. Удаленный метод получает блокировку для критической секции
  3. Клиент аварийно завершает работу, прежде чем удаленный метод выходит из критической секции

Будут ли сняты любые блокировки, полученные удаленным вызовом метода, связанным с этим клиентом? Или другие клиенты просто не смогут впоследствии получить блокировку?

Спасибо за ваши ответы

1 Ответ

4 голосов
/ 21 сентября 2011

Что происходит, так это то, что удаленный метод продолжает выполняться до тех пор, пока не будет завершен, и освобождает блокировки при выходе из критической секции.Затем он пытается вернуть результаты (если они есть) клиенту и завершается неудачно, потому что соединение было разорвано.

Здесь нет особой опасности ...

Конечно, еслиСервер использует Lock объекты, а не примитивные блокировки / мьютексы, тогда ему нужно сделать освобождение блокировки в блоке finally, чтобы справиться со случаем, когда происходит сбой из-за непредвиденного исключения.Но это другая проблема.Сбой клиента не вызовет этот сценарий.

...