Jakie jest znaczenie monitora obiektu w Javie? Po co używać tego słowa?

87

Czytając artykuły o wątkach Java często zauważam wyrażenie: „bieżący wątek jest właścicielem monitora tego obiektu”. Rozumiem znaczenie: wątek ma prawo operować na obiekcie. Ale zastanawiam się, dlaczego używamy wyrażenia „monitor obiektu” zamiast „blokada obiektu”?

Krótko mówiąc, nie znam znaczenia słowa „monitor”. Pytanie może być dziwne i proste. Ale chciałbym, żeby ktokolwiek mógł pomóc go rozwiązać. 3ks

jiafu
źródło
1
+1 @ulmangt za to, że jesteś jedyną osobą, która faktycznie odpowie na Twoje pytanie: Nazywamy ich „monitorami”, ponieważ tak nazwał ich Hoare w 1974 roku.
Solomon Slow

Odpowiedzi:

52

ale jestem zdziwiony, dlaczego używa się słowa „monitor obiektu” w przypadku „blokady obiektu”?

Zobacz odpowiedź ulmangt, aby znaleźć linki wyjaśniające termin „monitor” używany w tym kontekście. Zauważ, że:

„Monitory zostały wynalezione przez Per Brinch Hansen i CAR Hoare, a po raz pierwszy zostały wdrożone w języku Pascal równoległym Brincha Hansena”.

(Źródło: Wikipedia )

Po co używać terminu „monitor” zamiast „blokada”? Ściśle rzecz biorąc, terminy te mają różne znaczenie ... zwłaszcza jeśli używasz ich w sposób, w jaki były pierwotnie przeznaczone.

  • „Blokada” to coś z prymitywami pobierania i zwalniania, które zachowują określone właściwości blokady; np. wyłączny użytek lub pojedynczy autor / wielu czytelników.

  • „Monitor” to mechanizm, który zapewnia, że ​​tylko jeden wątek może wykonywać daną sekcję (lub sekcje) kodu w danym momencie. Można to zaimplementować za pomocą blokady (i „zmiennych warunkowych”, które umożliwiają wątkom czekanie na lub wysyłanie powiadomień do innych wątków, że warunek jest spełniony), ale jest to coś więcej niż tylko blokada. Rzeczywiście, w przypadku Javy, rzeczywista blokada używana przez monitor nie jest bezpośrednio dostępna. (Po prostu nie możesz powiedzieć „Object.lock ()”, aby uniemożliwić innym wątkom uzyskanie go ... tak jak w Lockprzypadku instancji Java ).

Krótko mówiąc, jeśli ktoś miałby być pedantycznym, „monitor” jest w rzeczywistości lepszym terminem niż „blokada” do charakteryzowania tego, co zapewnia Java. Ale w praktyce oba terminy są używane prawie zamiennie.

Stephen C.
źródło
10

Cytat z Inside the Java Virtual Machine

Wątek w wirtualnej maszynie Java żąda blokady, gdy dociera na początek regionu monitorowania. W Javie istnieją dwa rodzaje regionów monitorowania: zsynchronizowane instrukcje i zsynchronizowane metody.

Monitor

Monitor przypomina budynek, w którym znajduje się jedno specjalne pomieszczenie, w którym może przebywać tylko jeden wątek naraz. Pokój zwykle zawiera jakieś dane. Od momentu, gdy wątek wejdzie do tego pokoju do chwili opuszczenia go, ma wyłączny dostęp do wszelkich danych w pokoju. Wejście do budynku monitora nazywa się „wejściem na monitor”. Wejście do specjalnego pomieszczenia wewnątrz budynku nosi nazwę „pozyskania monitora”. Zajmowanie pokoju jest nazywane „posiadaniem monitora”, a opuszczanie pokoju - „zwolnieniem monitora”. Opuszczenie całego budynku nazywane jest „wyjściem z monitora”.

Oprócz tego, że jest powiązany z pewną ilością danych, monitor jest powiązany z jednym lub kilkoma bitami kodu, które w tej książce będą nazywane regionami monitorów.

Jak wspomniano wcześniej, język zapewnia dwa wbudowane sposoby identyfikowania regionów monitorowania w programach: zsynchronizowane instrukcje i zsynchronizowane metody. Te dwa mechanizmy, które implementują aspekt wzajemnego wykluczania synchronizacji, są obsługiwane przez zestaw instrukcji wirtualnej maszyny Java.

Zamek

Aby zaimplementować możliwość wzajemnego wykluczania monitorów, wirtualna maszyna Java wiąże blokadę (czasami nazywaną muteksem) z każdym obiektem i klasą. Blokada jest jak przywilej, który może posiadać tylko jeden wątek w danym momencie.

Pojedynczy wątek może wielokrotnie blokować ten sam obiekt. Dla każdego obiektu wirtualna maszyna Java przechowuje licznik, ile razy obiekt został zablokowany. Odblokowany obiekt ma liczbę zerową. Gdy wątek uzyskuje blokadę po raz pierwszy, liczba jest ponownie zwiększana do jednego. Za każdym razem, gdy wątek uzyskuje blokadę na tym samym obiekcie, liczba jest ponownie zwiększana.

Zane XY
źródło
6

synchronizedBlok wokół objectjest jego monitora, który kontroluje blokadę na obiekcie. Oto przykład

synchronized (object) {
   while (<condition does not hold>)
      object.wait(timeout);
   ... // Perform action appropriate to condition
}
abbas
źródło
4

Chociaż jest już późno, aby odpowiedzieć na to pytanie, pomyślałem, że dodam tylko na wypadek, gdyby było to przydatne.
Oto zsynchronizowany blok kodu Java wewnątrz niezsynchronizowanej metody Java

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

W przykładzie użyto "this", czyli instancji, na której jest wywoływana metoda add. Zsynchronizowana metoda instancji używa obiektu, do którego należy, jako obiektu monitora.
=> Tylko jeden wątek może być wykonywany wewnątrz bloku kodu Java zsynchronizowanego na tym samym obiekcie monitora.

Mężczyzna
źródło
3

Wirtualna maszyna języka Java wykorzystuje monitory do obsługi wielowątkowości. Monitory osiągają to dzięki dwóm koncepcjom - wzajemnemu wykluczaniu podczas uruchamiania wątków (tutaj pojawia się `` blokowanie '') oraz koordynacji jako środka komunikacji między wątkami (tutaj pojawiają się metody oczekiwania i powiadamiania obiektu).

Przeczytanie następnej części „Inside JVM” rozwiąże tę wątpliwość, czy jest to bardzo ładnie wyjaśnione tutaj (rozdział 20, Synchronizacja wątków)

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

adityalad
źródło