Читая статьи о потоках Java, я часто замечаю выражение: «текущий поток является владельцем монитора этого объекта». Я понимаю смысл: поток получает право работать с объектом. Но я не понимаю, почему мы используем фразу «монитор объекта» вместо «блокировка объекта»?
Короче говоря, я не знаю значения слова «монитор». Вопрос может быть странным и простым. Но я хочу, чтобы кто-нибудь помог решить эту проблему. 3кс
java
multithreading
monitor
цзяфу
источник
источник
Ответы:
См. Ответ ulmangt для ссылок, объясняющих термин «монитор», используемый в этом контексте. Обратите внимание, что:
(Источник: Википедия )
Зачем использовать термин «монитор», а не «замок»? Строго говоря, эти термины означают разные вещи ... особенно если вы используете их так, как они были изначально задуманы.
«Блокировка» - это что-то с примитивами получения и освобождения, которые поддерживают определенные свойства блокировки; например, исключительное использование или один писатель / несколько читателей.
«Монитор» - это механизм, который гарантирует, что только один поток может выполнять данный раздел (или разделы) кода в любой момент времени. Это может быть реализовано с помощью блокировки (и «переменных условий», которые позволяют потокам ждать или отправлять уведомления другим потокам о том, что условие выполнено), но это больше, чем просто блокировка. Действительно, в случае Java фактическая блокировка, используемая монитором, напрямую недоступна. (Вы просто не можете сказать «Object.lock ()», чтобы предотвратить его получение другими потоками ... как вы можете с
Lock
экземпляром Java .)Короче говоря, если проявить педантичность, «монитор» на самом деле более подходящий термин, чем «блокировка» для характеристики того, что предоставляет Java. Но на практике оба термина используются почти как синонимы.
источник
Монитор - это просто термин для объекта, методы которого можно безопасно использовать в многопоточной среде.
В Википедии есть отличная статья о мониторах:
http://en.wikipedia.org/wiki/Monitor_(synchronization)
Если прокрутить вниз, там даже есть раздел, посвященный Java .
источник
Цитата из виртуальной машины Java
Монитор
Замок
источник
synchronized
Блок вокругobject
является его монитор, который контролирует блокировку на объекте. Вот примерsynchronized (object) { while (<condition does not hold>) object.wait(timeout); ... // Perform action appropriate to condition }
источник
Несмотря на то, что поздно отвечать на этот вопрос, я решил просто добавить, если это будет полезно.
Вот синхронизированный блок кода Java внутри несинхронизированного метода Java
public void add(int value){ synchronized(this){ this.count += value; } }
В примере используется this, то есть экземпляр, для которого вызывается метод add. Синхронизированный метод экземпляра использует объект, которому он принадлежит, как объект монитора.
=> Только один поток может выполняться внутри блока кода Java, синхронизированного на одном объекте монитора.
источник
Виртуальная машина Java использует мониторы для поддержки многопоточности. Мониторы достигают этого с помощью двух концепций - взаимного исключения при выполнении потоков (здесь появляется «блокировка») и координации как средства межпотокового взаимодействия (здесь на помощь приходят методы ожидания и уведомления объекта).
Чтение следующей части из «Внутри JVM» устранит эти сомнения, это очень хорошо объяснено здесь (Глава 20, Синхронизация потоков) -
https://www.artima.com/insidejvm/ed2/threadsynchP.html
источник