Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

"Мониторы были изобретены Per Brinch Hansen и CAR Hoare, и впервые были реализованы на языке параллельного Паскаля Brinch Hansen".

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

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

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

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

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

Ответ 2

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

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

http://en.wikipedia.org/wiki/Monitor_ (синхронизация)

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

Ответ 3

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

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

Ответ 4

Каждый объект имеет встроенный монитор, ожидающий, что он будет использоваться каким-то кодом. В действительности большинство объектов никогда не используются в качестве монитора, поэтому мониторы не должны создаваться до тех пор, пока они не будут использованы. Вместо того, чтобы реализовать эту функцию, поскольку каждый объект имеет собственное поле монитора монитора, подумайте об этом как о реализации как JVM, имеющем глобальные мониторы HashMap.

Возможная реализация такова: всякий раз, когда вводится синхронизированный блок, JVM просматривает синхронизированный объект на карте (мониторы). Если он найдет его, он получит монитор. Если он не находит его, он входит в критический раздел, посвященный карте. Затем он снова ищет объект, потому что другой поток может создать его между предыдущей проверкой и входом в критический раздел. Если он еще не существует, он создает монитор для синхронизированного объекта и оставляет критический раздел

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

монитор

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

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

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

Замок

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

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