Вы правы. Текст неверный. Заглушки RMI поточно-ориентированы и могут вызываться одновременно несколькими потоками в одной клиентской JVM. Мне не известны какие-либо утверждения или тексты Уоллрата и других, в которых говорится что-то другое, и я слежу за этой темой с 1997 года.
В частности:
Я подумал, что при использовании синхронизированного метода в реализации удаленного объекта (т.е. реальной реализации, выполняющейся на сервере) одновременное выполнение этого метода предотвращается, даже если вызовы этого метода поступают с разных клиентских компьютеров (вызывая метод через прокси ... он же заглушка).
Вы правы.
В книге вместо этого говорится, что одновременное выполнение синхронизированных методов не предотвращается при использовании RMI.
Книга не только ошибочна, но и заявляет о невозможности. Как именно RMI может предотвратить работу синхронизации?
Логически, блокировка удаленного объекта проста. Предположим, что клиент A вызывает синхронизированный метод удаленного объекта.
Затем на сервере происходит обычная работа Java.
Чтобы доступ к удаленным объектам всегда выглядел точно так же, как к локальным объектам, необходимо было бы заблокировать A в заглушке на стороне клиента, которая реализует интерфейс объекта и к которой A имеет прямой доступ.
Мусор. Тот факт, что реализация удаленного метода synchronized
делает все необходимое.
Аналогично, другой клиент на другом компьютере должен быть также заблокирован локально, прежде чем его запрос может быть отправлен на сервер.
Опять это мусор.
Следствием этого является необходимость синхронизации разных клиентов на разных машинах.
Снова мусор.
Альтернативный подход - разрешить блокировку только на сервере.
'Разрешить'? Что это значит? synchronized
метод synchronized.
Вы не можете запретить это.
В принципе, это работает нормально, но проблемы возникают, когда клиент падает, пока его вызов обрабатывается сервером.
Снова мусор. Таких проблем не возникает. Сервер восстанавливается из этой ситуации либо через тайм-аут чтения, либо за исключением записи, либо даже при успешном завершении удаленного метода. Во всех трех случаях метод завершается, блокировка синхронизации снимается, и срок службы продолжается.
Как мы обсуждали в гл. 8, нам может потребоваться относительно сложные протоколы для обработки этой ситуации, которые могут существенно повлиять на общую производительность удаленных вызовов методов.
Ерунда.
Поэтому разработчики Java RMI решили ограничить блокировку удаленных объектов только прокси (Wollrath et al., 1996).
Я не знаю, на что еще это может ссылаться, кроме отрывка, который вы цитировали, и я много раз читал эту статью. Если авторы хотят полагаться на этот документ, они должны были предоставить цитату и надлежащую ссылку на главу и стих.
В любом случае дизайнеры RMI не сделали такого выбора. Не было такого выбора, чтобы сделать. synchronized
- это synchronized
независимо от того, что разработчики RMI могли или не могли пожелать, и аналогично notify()
и wait()
* final.
Они не могли сделать любой выбор. Предоставленная вами цитата не является «выбором»: это всего лишь утверждение о семантике Java.
Я неправильно интерпретирую текст или фактически указано, что синхронизированные методы "не очень синхронизированы" при использовании RMI?
Я думаю, что вы читаете это правильно, и это совершенно и совершенно неправильно, и не только неправильно, но очевидно неправильно. Как это может быть правильно?Java RMI не и, действительно, не может никоим образом не изменяет, не удаляет и не расширяет семантику synchronized
.