Что за монитор в Java?


130

Какой монитор называется в параллельном программировании на Java?

Когда я читаю, что «каждый объект связан с монитором», что это означает?

Это особый объект?


11
+1 Это заставило меня прочитать, как мониторы реализованы на уровне JVM. Узнал что-то новое
найкус

@naikus Я ожидаю, что вы поделитесь подробностями :)
roottraveller

Ответы:


90

Монитор - это механизм для управления одновременным доступом к объекту.

Это позволяет делать:

Поток 1:

public void a()
{
    synchronized(someObject) {
        // do something (1)
    }
}

Поток 2:

public void b()
{
    synchronized(someObject) {
        // do something else (2)
    }
}

Это предотвращает одновременный доступ потоков 1 и 2 к отслеживаемой (синхронизированной) секции. Один из них запустится, и монитор не позволит другому получить доступ к региону до завершения первого.

Это не особый объект. Это механизм синхронизации помещен в корне иерархии классов: java.lang.Object.

Есть также waitи notifyметоды , которые будут также использовать монитор объекта для связи между различными потоками.


1
Итак, можем ли мы сказать, что когда мы создаем синхронизированный метод, мы определяем блокировку (монитор) для этого метода объекта?
xdevel2000

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

31
И @Pablo - не бывает монитора для метода; мониторы существуют только для объектов, которые были бы включающим экземпляром для большинства методов или соответствующим Classобъектом для статических методов. Если у вас уже есть синхронизированный method1 () и вы объявляете method2 () synchronized, новые мониторы не создаются, и фактически вызов любого метода (для того же объекта) будет пытаться заблокировать тот же монитор. Это часто ловит новичков.
Анджей Дойл

1
@Andrzej: итак, с каждым объектом связан ОДИН монитор. Тогда у меня может быть много синхронизированных методов. После каждого вызова этих методов поток получает тот монитор, который выполняет синхронизацию.
xdevel2000

1
просто нужно прояснить это ... объект, который используется для вызова синхронизированного блока в потоке 1, может быть снова использован в другом потоке (поток 2) для одновременного вызова обычного метода (не синхронизированного)?

27

Монитор - это объект, который имеет как блокировку, так и набор ожидания . В Java любой Objectможет служить монитором.

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


Как вы сказали: «Монитор - это объект ...», означает ли это, что монитор - это внутренний объект / состояние, которое обладает / отслеживает блокировку и набор ожидания? Если нет. Не могли бы вы уточнить здесь Entity? В основном, когда в java-документе говорится Wakes up all threads that are waiting on this object's monitor. о notifyall (), я получаю, что объект поддерживает (с помощью внутреннего объекта / объекта), что все потоки ждут блокировки, этот внутренний объект / объект называется монитором?
user3198603

Самый полезный ответ. Спасибо @JRL.
gravetii

Для меня это говорит: «Предварительный просмотр этой страницы недоступен».
opncow

9
  1. Монитор - это концепция / механизм, не ограниченный языком Java;
  2. «В параллельном программировании монитор - это объект или модуль, предназначенный для безопасного использования более чем одним потоком»;
  3. Как известно каждому читателю, каждый объект в Java является подклассом java.lang.Object. Разработчики java сделали java.lang.Object таким образом, чтобы у него были функции и характеристики, позволяющие программистам Java использовать любой объект в качестве монитора. Например, у каждого объекта есть очередь ожидания, очередь повторного входа и методы ожидания и уведомления, что делает его монитором;
  4. про мониторы читайте здесь .

4

Язык Java и система времени выполнения поддерживают синхронизацию потоков с помощью мониторов.
Монитор связан с конкретным элементом данных (условной переменной) и действует как блокировка этих данных. Когда поток удерживает монитор для некоторого элемента данных, другие потоки блокируются и не могут проверять или изменять данные.



2

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

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

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

Для получения дополнительной информации перейдите по ссылке


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