Всегда ли необходимо использовать объект «монитор» (Java)? - PullRequest
3 голосов
/ 08 марта 2012

Я видел объектные мониторы, используемые в Java несколько раз, но мне кажется, что любая логика монитора объектов может быть легко заменена использованием синхронизированных блоков кода и / или методов.

Какова цель использования явного монитора объекта, а не просто тщательной координации синхронизированных блоков кода вместе с примитивами Atomic?

Ответы [ 4 ]

4 голосов
/ 08 марта 2012

Всегда есть объект монитора.Когда у вас есть синхронизированный блок, ваш экземпляр класса является объектом монитора.Итак, причины использования явных объектов:

1) вы можете делить их между экземплярами классов для синхронизации доступа к общему ресурсу

2) более явные

3) вы можете датьваш объект монитора полезное имя

4) более гибкий

4 голосов
/ 08 марта 2012

Вы делаете различие там, где его нет (или используете необычную терминологию).В терминах Java монитор - это объект, используемый в качестве параметра для синхронизированного блока (или, в случае методов синхронизированного экземпляра, неявно экземпляр this, а с синхронизированным статическим методом - экземпляр класса).

3 голосов
/ 08 марта 2012

Главное, что обычный блок synchronized использует в качестве монитора вмещающий объект, другими словами, это эквивалентно использованию synchronized(this) { }.Проблема заключается в области видимости / видимости: любой класс, внешний по отношению к вашему классу, может выбрать синхронизацию в одном и том же экземпляре и вмешаться в вашу логику синхронизации.При использовании ссылки private final в качестве монитора это больше невозможно (при условии отсутствия отраженных махинаций).

Это сформулировано в Параллелизм Java на практике следующим образом (стр. 61, раздел 4.2)..1):

Существуют преимущества использования объекта частной блокировки вместо внутренней блокировки объекта (или любой другой общедоступной блокировки).Делая объект блокировки закрытым, он блокирует блокировку, чтобы клиентский код не мог ее получить, тогда как общедоступная блокировка позволяет клиентскому коду участвовать в его политике синхронизации - правильно или неправильно.Клиенты, которые неправильно получают блокировку другого объекта, могут вызвать проблемы жизнеспособности, и проверка правильности использования общедоступной блокировки требует проверки всей программы, а не отдельного класса.

2 голосов
/ 08 марта 2012

, но мне кажется, что любая логика монитора объектов может быть легко заменена использованием синхронизированных блоков кода и / или методов.

Да, это верно по той же причинестакан воды можно легко заменить стаканом воды - это одно и то же.Синхронизированные блоки кода и методы Java предоставляют шаблон монитора на уровне языка.

...