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
java
multithreading
monitor
jiafu
źródło
źródło
Odpowiedzi:
Zobacz odpowiedź ulmangt, aby znaleźć linki wyjaśniające termin „monitor” używany w tym kontekście. Zauważ, że:
(Ź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
Lock
przypadku 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.
źródło
Monitor to po prostu termin określający obiekt, którego metody można bezpiecznie używać w środowisku wielowątkowym.
Jest świetny artykuł w Wikipedii na temat monitorów:
http://en.wikipedia.org/wiki/Monitor_(synchronization)
Jeśli przewiniesz w dół, znajdziesz tam nawet sekcję o Javie .
źródło
Cytat z Inside the Java Virtual Machine
Monitor
Zamek
źródło
synchronized
Blok wokółobject
jest jego monitora, który kontroluje blokadę na obiekcie. Oto przykładsynchronized (object) { while (<condition does not hold>) object.wait(timeout); ... // Perform action appropriate to condition }
źródło
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.
źródło
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
źródło