Що означає монітор об’єкта в Java? Навіщо вживати це слово?


87

Читаючи статті про потоки Java, я часто помічаю вираз: "поточний потік є власником монітора цього об'єкта". Я розумію значення: нитка отримує право оперувати об’єктом. Але мене бентежить, чому ми використовуємо фразу "монітор об'єкта" замість "блокування об'єкта"?

Коротше кажучи, я не знаю значення слова «монітор». Питання може бути дивним і простим. Але я хотів би, щоб хтось допоміг вирішити це. 3кс


1
+1 @ulmangt за те, що він єдиний, хто насправді відповів на ваше запитання: ми називаємо їх "моніторами", тому що так їх називав Хоар у 1974 році.
Соломон Повільний,

Відповіді:


51

але мене бентежить, навіщо використовувати слово "монітор об'єкта" поряд з "замком об'єкта"?

Дивіться відповідь ulmangt на посилання, що пояснюють термін "монітор", як він використовується в цьому контексті. Зверніть увагу, що:

"Монітори були винайдені Пер Брінчем Хансеном та ЦАР Хоаром, і вперше були впроваджені мовою одночасної паскалі Брінча Хансена".

(Джерело: Вікіпедія )

Навіщо використовувати термін "монітор", а не "блокування"? Ну, строго кажучи, терміни означають різні речі ... особливо, якщо ви використовуєте їх так, як вони спочатку задумувались.

  • "Блокування" - це щось із примітивами придбання та вивільнення, які підтримують певні властивості блокування; напр., ексклюзивне використання або одноразове / багаторазове читання

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

Коротше кажучи, якщо би хтось був педантичним "монітор" - це насправді кращий термін, ніж "замок" для характеристики того, що забезпечує Java. Але на практиці обидва терміни використовуються майже як взаємозамінні.



9

Цитата всередині віртуальної машини Java

Потік у віртуальній машині Java запитує блокування, коли надходить на початок області монітора. У Java існує два типи регіонів моніторингу: синхронізовані оператори та синхронізовані методи.

Монітор

Монітор схожий на будівлю, що містить одну спеціальну кімнату, яку одночасно може займати лише одна нитка. У кімнаті зазвичай містяться деякі дані. З моменту, коли нитка потрапляє в цю кімнату, до моменту її виходу вона має ексклюзивний доступ до будь-яких даних у кімнаті. Вхід у будівлю монітора називається «вхід у монітор». Вхід у спеціальну кімнату всередині будівлі називається "придбання монітора". Зайняття кімнати називається «володіння монітором», а вихід із кімнати - «звільнення монітора». Вихід з цілої будівлі називається "виходом з монітора".

Окрім того, що монітор асоціюється з бітом даних, монітор асоціюється з одним або кількома бітами коду, який у цій книзі буде називатися регіонами монітора.

Як зазначалося раніше, мова забезпечує два вбудовані способи ідентифікації регіонів моніторингу у ваших програмах: синхронізовані оператори та синхронізовані методи. Ці два механізми, що реалізують аспект взаємного виключення синхронізації, підтримуються набором інструкцій віртуальної машини Java.

Замок

Щоб реалізувати можливість взаємного виключення моніторів, віртуальна машина Java пов'язує замок (іноді його називають mutex) з кожним об'єктом і класом. Блокування схоже на привілей, яким може володіти в один момент часу лише один потік.

Одному потоку дозволяється блокувати один і той же об’єкт кілька разів. Для кожного об’єкта віртуальна машина Java підтримує підрахунок кількості блокувань об’єкта. Розблокований об’єкт має нульовий відлік. Коли нитка вперше отримує блокування, відлік знову збільшується до одиниці. Щоразу, коли потік отримує блокування для того самого об’єкта, кількість знову збільшується.


6

synchronizedБлок навколо objectє його монітор, який контролює блокування на об'єкті. Ось приклад

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

4

Незважаючи на те, що пізно відповісти на це питання, я думав просто додати на випадок, якщо це корисно.
Ось синхронізований блок коду Java всередині несинхронізованого методу Java

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

У прикладі використовується "this", що є екземпляром, для якого викликається метод add. Синхронізований метод екземпляра використовує об’єкт, якому він належить, як об’єкт моніторингу.
=> Тільки один потік може виконуватися всередині блоку коду Java, синхронізованого на тому самому об'єкті монітора.


3

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

Читання наступної частини з "Inside JVM" очистить цей сумнів, чи це дуже красиво пояснено тут (Глава 20, Синхронізація потоків) -

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

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