Что означает монитор объекта в Java? Зачем использовать это слово?


87

Читая статьи о потоках Java, я часто замечаю выражение: «текущий поток является владельцем монитора этого объекта». Я понимаю смысл: поток получает право работать с объектом. Но я не понимаю, почему мы используем фразу «монитор объекта» вместо «блокировка объекта»?

Короче говоря, я не знаю значения слова «монитор». Вопрос может быть странным и простым. Но я хочу, чтобы кто-нибудь помог решить эту проблему. 3кс


1
+1 @ulmangt за то, что был единственным, кто действительно ответил на ваш вопрос: мы называем их «мониторами», потому что так Хоар называл их еще в 1974 году.
Соломон Медленный,

Ответы:


51

но я недоумеваю, зачем использовать слово «монитор объекта» вместо «блокировка объекта»?

См. Ответ ulmangt для ссылок, объясняющих термин «монитор», используемый в этом контексте. Обратите внимание, что:

«Мониторы были изобретены Пером Бринчем Хансеном и К.А. Хоаром и впервые были реализованы на языке Concurrent Pascal Бринча Хансена».

(Источник: Википедия )

Зачем использовать термин «монитор», а не «замок»? Строго говоря, эти термины означают разные вещи ... особенно если вы используете их так, как они были изначально задуманы.

  • «Блокировка» - это что-то с примитивами получения и освобождения, которые поддерживают определенные свойства блокировки; например, исключительное использование или один писатель / несколько читателей.

  • «Монитор» - это механизм, который гарантирует, что только один поток может выполнять данный раздел (или разделы) кода в любой момент времени. Это может быть реализовано с помощью блокировки (и «переменных условий», которые позволяют потокам ждать или отправлять уведомления другим потокам о том, что условие выполнено), но это больше, чем просто блокировка. Действительно, в случае Java фактическая блокировка, используемая монитором, напрямую недоступна. (Вы просто не можете сказать «Object.lock ()», чтобы предотвратить его получение другими потоками ... как вы можете с Lockэкземпляром Java .)

Короче говоря, если проявить педантичность, «монитор» на самом деле более подходящий термин, чем «блокировка» для характеристики того, что предоставляет Java. Но на практике оба термина используются почти как синонимы.



9

Цитата из виртуальной машины Java

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

Монитор

Монитор похож на здание, которое содержит одну специальную комнату, в которой одновременно может находиться только один поток. Комната обычно содержит какие-то данные. С того момента, как поток входит в эту комнату и до момента выхода, он имеет эксклюзивный доступ к любым данным в этой комнате. Вход в здание монитора называется «входом в монитор». Вход в специальную комнату внутри здания называется «приобретением монитора». Захват комнаты называется «владением монитором», а выход из комнаты - «освобождением монитора». Покидание всего здания называется «выходом из монитора».

Помимо того, что монитор связан с битом данных, он связан с одним или несколькими битами кода, которые в этой книге будут называться областями монитора.

Как упоминалось ранее, язык предоставляет два встроенных способа идентификации областей монитора в ваших программах: синхронизированные операторы и синхронизированные методы. Эти два механизма, которые реализуют аспект взаимного исключения синхронизации, поддерживаются набором команд виртуальной машины Java.

Замок

Чтобы реализовать возможность взаимного исключения мониторов, виртуальная машина Java связывает блокировку (иногда называемую мьютексом) с каждым объектом и классом. Блокировка подобна привилегии, которой может «владеть» только один поток одновременно.

Одному потоку разрешено блокировать один и тот же объект несколько раз. Для каждого объекта виртуальная машина Java ведет подсчет количества блокировок объекта. У незаблокированного объекта счетчик равен нулю. Когда поток получает блокировку в первый раз, счет снова увеличивается до единицы. Каждый раз, когда поток получает блокировку одного и того же объекта, счетчик снова увеличивается.


6

synchronizedБлок вокруг objectявляется его монитор, который контролирует блокировку на объекте. Вот пример

synchronized (object) {
   while (<condition does not hold>)
      object.wait(timeout);
   ... // Perform action appropriate to condition
}

4

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

public void add(int value){
synchronized(this){
      this.count += value;
   }
}

В примере используется this, то есть экземпляр, для которого вызывается метод add. Синхронизированный метод экземпляра использует объект, которому он принадлежит, как объект монитора.
=> Только один поток может выполняться внутри блока кода Java, синхронизированного на одном объекте монитора.


3

Виртуальная машина Java использует мониторы для поддержки многопоточности. Мониторы достигают этого с помощью двух концепций - взаимного исключения при выполнении потоков (здесь появляется «блокировка») и координации как средства межпотокового взаимодействия (здесь на помощь приходят методы ожидания и уведомления объекта).

Чтение следующей части из «Внутри JVM» устранит эти сомнения, это очень хорошо объяснено здесь (Глава 20, Синхронизация потоков) -

https://www.artima.com/insidejvm/ed2/threadsynchP.html

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.