Что такое монитор java
Перейти к содержимому

Что такое монитор java

  • автор:

Пакет javax.management.monitor

Исключение, выданное монитором, когда установка монитора становится недопустимой, в то время как монитор работает.

Пакет javax.management.monitor Описание

Обеспечивает определение классов монитора. Монитор является MBean, который периодически наблюдает значение атрибута в одном или более других MBeans. Если атрибут соблюдает определенное условие, Монитор испускает a MonitorNotification . Когда монитор MBean периодически вызывает getAttribute чтобы получить значение атрибута, контролируемого, это делает так в пределах контекста управления доступом Monitor.start() вызывающая сторона.

Контролируемое значение может быть простым значением, содержавшим в пределах составного типа. Например, MemoryMXBean определенный в java.lang.management имеет атрибут HeapMemoryUsage типа MemoryUsage . Чтобы контролировать количество используемой памяти, описанной свойством used MemoryUsage, Вы могли контролировать «HeapMemoryUsage.used«. Та строка была бы параметром setObservedAttribute .

Правила, используемые, чтобы интерпретировать ObservedAttribute как "HeapMemoryUsage.used", следующие. Предположите, что строка является A.e (таким образом, A был бы "HeapMemoryUsage", и e будет "used" в примере).

Сначала значение атрибута A получается. Вызовите это v. Значение x извлекается из v следующим образом:

  • Если v является a CompositeData и если v. get(e) возвращается значение тогда x является тем значением.
  • Если v является массивом, и e является строкой, "length" тогда x является длиной массива.
  • Если вышеупомянутые правила не производят значение, и если Introspector.getBeanInfo для класса v (v. getClass()), содержит a PropertyDescriptor с именем e тогда x является результатом вызова свойства read method на v.

Третье правило означает например, что, если атрибут HeapMemoryUsage является MemoryUsage, контролируя "HeapMemoryUsage.used", получит наблюдаемую величину, вызывая MemoryUsage.getUsed().

Если ObservedAttribute содержит больше чем один период, например "ConnectionPool.connectionStats.length", то вышеупомянутые правила применяются многократно. Здесь, v первоначально был бы значением атрибута ConnectionPool, и x будет получен, применяя вышеупомянутые правила с e, равным "connectionStats". Затем v был бы установлен в этот x и новый x, полученный, применяя правила снова с e, равным "length".

Хотя рекомендуется, чтобы названия атрибута были допустимыми идентификаторами Java, для атрибута возможно быть вызванным HeapMemoryUsage.used. Это означает, что ObservedAttribute, который является HeapMemoryUsage.used, мог означать, что значение, чтобы наблюдать является или атрибутом того имени, или свойством used в пределах атрибута под названием HeapMemoryUsage. Так по причинам совместимости, когда ObservedAttribute содержит период (.), монитор проверит, существует ли атрибут, чье имя является полной строкой ObservedAttribute (HeapMemoryUsage.used в примере). Это делает это, вызывая getMBeanInfo для наблюдаемого MBean и поиска содержавшего MBeanAttributeInfo с именем. Если Вы находитесь, то, именно это контролируется. Если больше чем один MBean наблюдается, поведение неуказанное, если у некоторых из них есть атрибут HeapMemoryUsage.used, и другие не делают. Реализация может поэтому вызвать getMBeanInfo на только одном из MBeans в этом случае. Поведение является также неуказанным, если результат проверки изменяется, в то время как монитор является активным.

Точное поведение мониторов детализируется в Спецификации JMX. То, что следует, является сводкой.

Есть три вида Мониторов:

  • A CounterMonitor наблюдает атрибуты целочисленного типа. Атрибуты, как предполагается, являются неотрицательными, и монотонно увеличивающийся за исключением возможной трансформации в указанном модуле. У каждого наблюдаемого атрибута есть связанное пороговое значение. Уведомление отправляется, когда атрибут превышает свой порог. Значение смещения может быть определено. Когда наблюдаемая величина превышает свой порог, порог постепенно увеличивается смещением, или кратным числом смещения, достаточного, чтобы сделать порог больше чем новая наблюдаемая величина. A CounterMonitor может работать в режиме различия. В этом режиме значение, сравненное с порогом, является различием между двумя последовательными наблюдениями за атрибутом.
  • A GaugeMonitor наблюдает атрибуты числового типа. У каждого наблюдаемого атрибута есть связанный высокий порог и низкий порог. Когда наблюдаемый атрибут пересекает высокий порог, если уведомление высокого флага является истиной, то уведомление отправляется. Последующие пересечения высокого порогового значения не инициируют дальнейшие уведомления, пока значение прибора не станет меньше чем или равным низкому порогу. Когда наблюдаемый атрибут пересекает низкий порог, если уведомление низкого флага является истиной, то уведомление отправляется. Последующие пересечения низкого порогового значения не инициируют дальнейшие уведомления, пока значение прибора не станет больше чем или равный высокому порогу. Как правило, только одно из уведомления высоко и уведомляет, что низкие флаги устанавливаются. Другой порог используется, чтобы обеспечить гистерезисный механизм, чтобы избежать повторного инициирования уведомлений, когда атрибут делает маленькие колебания вокруг порогового значения. A GaugeMonitor может работать в режиме различия. В этом режиме значение, сравненное с высокими и низкими порогами, является различием между двумя последовательными наблюдениями за атрибутом.
  • A StringMonitor наблюдает атрибуты типа String . Уведомление отправляется, когда наблюдаемый атрибут становится равным и/или не равный данной строке.

Платформа Java™
Стандарт Эд. 7

Представьте ошибку или функцию
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE . Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.

Мютекс и монитор

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

— Я готов слушать.

Мютекс – это специальный объект для синхронизации нитей/процессов. Он может принимать два состояния – занят и свободен. Если упростить, то мютекс – это boolean-переменная, которая принимает два значения: занят(true) и свободен(false).

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

— Т.е. мютекс – это как табличка на двери – занят/свободен?

— Да. И такой мютекс прикреплен к каждому объекту в Java. Прямой доступ к мютексу есть только у Java-машины. От программиста он скрыт.

— А как же тогда его использовать?

— А работать с мютексом в Java можно посредством монитора.

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

В Java монитор реализован с помощью ключевого слова synchronized.

Когда ты пишешь блок synchronized, то компилятор Java заменяет его тремя кусками кода:

1) В начале блока synchronized добавляется код, который отмечает мютекс как занятый.

2) В конце блока synchronized добавляется код, который отмечает мютекс как свободный.

3) Перед блоком synchronized добавляется код, который смотрит, если мютекс занят – то нить должна ждать его освобождения.

Вот как это примерно работает:

synchronized(object)  object.doJob(); >
while (object.mutex) Thread.sleep(1); object.mutex = true; object.doJob(); object.mutex = false;

На самом деле логика там другая и сложнее, но это уже детали.

— А можно подробности?

— Пока не научишься правильно этим пользоваться – в детали лезть нет смысла.

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

— Не очень. Просто все быстро забывается…

— Чем меньше практики, тем меньше пользы и от теории.

Вот уровню к 40 научишься всем этим пользоваться, и я тебе объясню, как все устроено на самом деле. А пока — учись просто правильно всем пользоваться. Ясно?

What’s a monitor in Java?

Before jumping into Monitor, we need to understand two things.

Don’t confuse this critical area with the critical section. since here, the Critical area is mentioned at the object level, not at the thread level. The shared data is considered a critical area.

Each object and its class are associated with a monitor. Instance variables of objects that need to be protected from concurrent access included a critical area for a monitor that is associated with the object and Instance variables of classes /static variables of a class that needs to be protected from concurrent access included in the critical area for the monitor which is associated with the class.

  • This critical area is protected with a lock and this lock ensures mutual exclusion.
  • A Wait set is also associated with a monitor that is used to provide coordination between threads.
  • An entry set is used to hold the threads that are already requested for the lock and the lock is not acquired by them yet.*

How is mutual exclusion achieved on Monitor?

Each object is associated with a monitor and this monitor has a lock where each thread can lock or unlock the object using this lock when it accesses the shared variables.

Explicitly, it means only one thread at a time may hold a lock on a monitor. Any other threads attempting to lock that lock are blocked until they can obtain the lock.

when a new thread tries to acquire the lock and if already a thread owns the lock then that thread will be waiting on the entry set to acquire the lock.

when the thread which is acquired the lock completes its critical section, it will release the lock. So next thread will acquire the lock but this next thread is taken from the entry set and will be determined by JVM based on some criteria like FIFO.

Here, what we achieved is mutual exclusion since we give exclusive access to a thread to the object and we do not allow any other threads to enter their critical section.

Example java code to achieve mutual exclusion using the monitor

class Counterprivate int count = 0;public void synchronized Increment() int n = count;count = n+1;> //Here synchronized is used to indicate those things should be done sequentially.>

How is coordination/synchronization achieved via Monitor?

Synchronization is achieved using the wait set which is associated with the monitor and the “wait and notify” or “signal and continue” mechanism.

Synchronization is important when one thread needs some data to be in a particular state and another thread is responsible for getting the data into that state e.g. producer/consumer problem

When a thread calls the wait() method with respect to the object then the thread is suspended and added to the wait set to wait until some other thread invokes notify() or notifyAll() on the same object.

The notify() method is used for waking up threads that are in the wait set of the monitor of a particular object. There are two ways of notifying waiting threads.

  • notify() → For all threads waiting on wait set the method notify() notifies anyone of them to wake up arbitrarily. The choice of exactly which thread to wake is non-deterministic and depends upon the JVM.
  • notifyAll() → This method simply wakes all threads that are waiting on the wait set. The awakened threads will not be able to proceed until the current thread releases the lock on this object. The awakened threads will compete in the usual manner with any other threads that might be actively competing to synchronize.

Example java code to achieve synchronization using the monitor in producer-consumer problem

class Buffer private char [] buffer;private int count = 0, in = 0, out = 0;Buffer(int size)buffer = new char[size];>public synchronized void Put(char c) while(count == buffer.length)try catch (InterruptedException e) finally >System.out.println(“Producing “ + c + “ …”);buffer[in] = c;in = (in + 1) % buffer.length;count++;notify();>public synchronized char Get() while (count == 0)try catch (InterruptedException e) finally >char c = buffer[out];out = (out + 1) % buffer.length;count — ;System.out.println(“Consuming “ + c + “ …”);notify();return c;>>

I reshared my SO answer as a blog. you can find the question here.

Что такое монитор java

Мьютекс (одноместный семафор) — флаг блокировки обьекта (только для одного потока) Монитор — скрытая логика мьютекса и семафора которая исполняется JVM Семафор — флаг блокировки обьекта (количество потоков, которые пользуются обьектом можно настроить).

ivan Уровень 40
11 сентября 2023

ребята купите какой-нибудь видеокурс (не алишев. слишком мало инфы). без него тяжело учиться пишет человек который отучился без видеокурса и уже закончил несколько видеокурсов

Denis Odesskiy Уровень 31
26 мая 2023

 Популярной аналогией мьютекса в реальной жизни можно считать «пример с туалетом». 

Так?

 package com.javalerning.example.myownexample02; import java.util.ArrayList; import java.util.List; /* Пример с туалетом */ public class Main < private static final Sortire SORTIRE = new Sortire(); public static void main(String[] args) < SufferingMan.createAndStartThread(); >private static void defecate() < try < Thread.sleep(2000); >catch (InterruptedException ignored) < >> private static void waitingsQueues() < try < Thread.sleep(2000); >catch (InterruptedException ignored) < >> //В методах класса Sortire, нужна синхронизация, //чтобы Петя и Вася не оказались вместе в одном туалете: private static class Sortire < private Thread thread; public Thread getSortireStatus() < return thread; >private synchronized void setSortireStatus(Thread thread) < this.thread = thread; >private synchronized boolean trySetSortireIsFree(Thread thread) < if (this.thread == null) < this.thread = thread; return true; >return false; > > 

ivan Уровень 40
10 апреля 2023

В Java ключевое слово synchronized используется для обеспечения взаимного исключения и гарантирует, что только один поток может получить доступ к критической секции кода в данный момент. Ключевое слово synchronized может использоваться с блоком кода или методом, и оно использует монитор объекта для синхронизации. В Java монитор — это синхронизационный конструкт, который ассоциирован с объектом. Каждый объект в Java имеет встроенный монитор, который можно использовать для синхронизации доступа к методам и полям этого объекта. Когда поток входит в синхронизированный блок кода или метод, он получает монитор, связанный с объектом, и удерживает его до тех пор, пока не выйдет из блока кода или метода. Мьютекс — это синхронизационный примитив, который используется для защиты общих ресурсов от одновременного доступа нескольких потоков. В Java ключевое слово synchronized может использоваться для обеспечения взаимного исключения, что аналогично функциональности мьютекса. Семафор — это синхронизационный примитив, который используется для управления доступом к общему ресурсу. В Java класс Semaphore может использоваться для реализации семафоров, которые можно использовать для контроля доступа к общим ресурсам несколькими потоками. Таким образом, ключевое слово synchronized использует монитор объекта, который аналогичен мьютексу. Оно не использует семафор напрямую, но семафор можно реализовать с помощью класса Semaphore в Java.

Evgeny Balanda Уровень 37
8 апреля 2023

Странно, что в «Философия Java» Брюса Эккеля (4 издание) дают определения мьютекса и монитора наоборот: мьютекс — это механизм блокировки, а монитор — флаг, который используется для того, чтобы показать, что ресурс заблокирован: > Для решения проблемы соперничества потоков фактически все многопоточные схемы синхронизируют доступ к разделяемьм ресурсам. Это означает, что доступ к разделяе­мому ресурсу в один момент времени может получить только одна задача. Чаще всего это выполняется помещением фрагмента кода в предложение блокировки так, что одновременно пройти по этому фрагменту кода может только одна задача. Поскольку такое предложение блокировки дает эффект взаимного исключения (mutual exclusion), этот механизм часто называют мьютексом (mutex). > Каждый объект содержит объект простой блокировки (также называемый монитором), который автоматически является частью этого объекта (вам не придется писать для нее специального кода). Когда вы вызываете любой синхронизированный (synchronized) метод, объект переходит в состояние блокировки, и пока этот метод не закончит свою работу и не снимет блокировку, другие синхронизированные методы для объекта не могут быть вызваны.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *