Що таке монітор у Java?


129

На який монітор йдеться в одночасному програмуванні на Java?

Коли я прочитав, що "кожен об'єкт асоціював монітор", що це означає?

Це спеціальний об’єкт?


11
+1 Це змусило мене прочитати, як монітори реалізовані на рівні JVM. Дізнався чогось нового
naikus

@naikus Я сподіваюся, що ви
поділитесь

Відповіді:


89

Монітор - це механізм контролю паралельного доступу до об'єкта.

Це дозволяє:

Нитка 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
Ем, не зовсім так. Кожен об'єкт автоматично має монітор (mutex), пов'язаний з ним, незалежно від будь-чого іншого. Коли ви оголошуєте метод синхронізованим, ви заявляєте, що час виконання повинен отримати замок на моніторі об'єкта перед початком виконання цього методу (і повинен звільнити замок, перш ніж контроль повернеться до викличного коду).
Анджей Дойл

31
І @Pablo - немає такого поняття, як монітор методу; монітори існують лише для об'єктів, які були б примірником для більшості методів, або відповідним Classоб'єктом для статичних методів. Якщо у вас вже є синхронізований метод1 () і ви оголошуєте метод2 () синхронізованим, нові монітори не створюються, і фактично виклик будь-якого методу (на одному об'єкті) намагатиметься заблокувати той же монітор. Це часто виловлює новачків.
Анджей Дойль

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

1
просто потрібно уточнити це ... об'єкт, який використовується для виклику синхронізованого блоку в потоці 1, може бути використаний знову в іншому потоці (потоці 2) для виклику звичайного методу (не синхронізованого) одночасно?

26

Монітор - це сутність, яка має як замок, так і набір очікування . На Java будь-якийObject може служити монітором.

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


Як ви сказали "Монітор є сутністю ..", чи означає це, що монітор - це внутрішній об'єкт / стан, який має / відстежує замок і набір очікування? Якщо ні, чи можете ви, будь ласка, розробити тут сутність? В основному, коли ми Java Wakes up all threads that are waiting on this object's monitor. Jac каже про notifyall (), що я отримую, це об'єкт - це підтримувати (за допомогою внутрішньої сутності / об'єкта) те, що всі потоки чекають блокування, що внутрішня сутність / об'єкт називається монітором?
користувач3198603

Найкорисніша відповідь. Дякую @JRL.
gravtii

Для мене це говорить: "Попередній перегляд для цієї сторінки недоступний."
opncow

9
  1. Монітор - це концепція / механізм, який не обмежується мовою Java;
  2. "У паралельному програмуванні монітор - це об'єкт або модуль, призначений для безпечного використання більш ніж одним потоком";
  3. Як знає кожен читач, кожен об’єкт на Java - це підклас java.lang.Object. Люди java зробили java.lang.Object таким чином, що він має функції та характеристики, які дозволяють програмістам Java використовувати будь-який об’єкт у якості монітора. Наприклад, кожен об'єкт має чергу очікування, чергу повторного входу та методи очікування та сповіщення, що робить його монітором;
  4. читайте про монітори тут .

4

Мова Java та система виконання підтримують синхронізацію потоків за допомогою моніторів.
Монітор асоціюється з певним елементом даних (змінною умови) і функціонує як блокування цих даних. Коли потік тримає монітор для деякого елемента даних, інші потоки блокуються і не можуть перевіряти або змінювати дані.



2

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

Монітори також мають механізм сигналізації інших потоків про те, що їх умова виконана. Це сутність, яка має як замок, так і набір очікування. У Java будь-який Об'єкт може служити монітором.

У віртуальній машині Java кожен об'єкт і клас логічно пов'язаний з монітором. Для реалізації можливостей взаємного виключення моніторів з кожним об'єктом і класом асоціюється замок (іноді його називають mutex). Це називається семафором в термінах операційних систем, mutex - це бінарний семафор.

Для отримання додаткової інформації перевірте посилання


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.