Что означает монитор объекта в Java? Зачем использовать это слово? - PullRequest
77 голосов
/ 24 марта 2012

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

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

Ответы [ 6 ]

47 голосов
/ 24 марта 2012

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

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

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

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

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

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

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

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

21 голосов
/ 24 марта 2012

Монитор - это просто термин для объекта, методы которого можно безопасно использовать в многопоточной среде.

На мониторах есть отличная статья в Википедии:

http://en.wikipedia.org/wiki/Monitor_(synchronization)

Если вы прокрутите страницу вниз, она даже откроет секцию о Java .

.
5 голосов
/ 09 июля 2014

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

synchronized (object) {
   while (<condition does not hold>)
      object.wait(timeout);
   ... // Perform action appropriate to condition
}
4 голосов
/ 02 февраля 2017

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

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

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

3 голосов
/ 15 февраля 2019

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

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

Монитор

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

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

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

Lock

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

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

2 голосов
/ 12 августа 2015

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

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

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

...