Was ist ein Monitor in Java?


129

Worauf bezieht sich ein Monitor bei der gleichzeitigen Programmierung in Java?

Wenn ich lese, dass "jedem Objekt ein Monitor zugeordnet ist", was bedeutet das?

Ist es ein besonderes Objekt?


11
+1 Dadurch habe ich gelesen, wie Monitore auf JVM-Ebene implementiert sind.
Ich

@naikus Ich erwarte, Details von Ihnen zu teilen :)
Roottraveller

Antworten:


89

Ein Monitor ist ein Mechanismus zur Steuerung des gleichzeitigen Zugriffs auf ein Objekt.

Dies ermöglicht Ihnen Folgendes:

Thread 1:

public void a()
{
    synchronized(someObject) {
        // do something (1)
    }
}

Thread 2:

public void b()
{
    synchronized(someObject) {
        // do something else (2)
    }
}

Dies verhindert, dass Threads 1 und 2 gleichzeitig auf den überwachten (synchronisierten) Abschnitt zugreifen. Einer startet und der Monitor verhindert, dass der andere auf die Region zugreift, bevor der erste beendet ist.

Es ist kein besonderes Objekt. Der Synchronisationsmechanismus befindet sich im Stamm der Klassenhierarchie:java.lang.Object .

Darüber hinaus gibt es waitund notifyMethoden , die auch Gegenstand des Monitors auf die Kommunikation zwischen den verschiedenen Threads verwenden.


1
Können wir also sagen, dass wir beim Erstellen einer synchronisierten Methode eine Sperre (einen Monitor) für die Methode dieses Objekts definieren?
xdevel2000

28
Ähm, nicht genau. Jedem Objekt ist automatisch ein Monitor (Mutex) zugeordnet, unabhängig von irgendetwas anderem. Wenn Sie eine Methode als synchron deklarieren, erklären Sie, dass die Laufzeit die Sperre auf dem Objektmonitor erhalten muss, bevor die Ausführung dieser Methode beginnt (und die Sperre aufheben muss, bevor die Steuerung zum aufrufenden Code zurückkehrt).
Andrzej Doyle

31
Und @Pablo - es gibt keinen Monitor für eine Methode; Monitore existieren nur für Objekte, die für die meisten Methoden die einschließende Instanz oder Classfür statische Methoden das entsprechende Objekt sind. Wenn Sie bereits eine synchronisierte Methode1 () haben und die Methode2 () als synchronisiert deklarieren, werden keine neuen Monitore erstellt. Wenn Sie eine der beiden Methoden (für dasselbe Objekt) aufrufen, wird versucht, denselben Monitor zu sperren. Dies fängt oft Neuankömmlinge auf.
Andrzej Doyle

1
@Andrzej: Jedem Objekt ist EIN Monitor zugeordnet. Dann kann ich viele synchronisierte Methoden haben. Nach jedem dieser Methoden ruft ein Thread den Monitor auf, der die Synchronisierung durchführt.
xdevel2000

1
Müssen Sie dies nur klären ... kann das Objekt, das zum Aufrufen eines synchronisierten Blocks in Thread 1 verwendet wird, erneut in einem anderen Thread (Thread 2) verwendet werden, um gleichzeitig die normale Methode (nicht synchronisiert) aufzurufen?

26

Ein Monitor ist eine Entität, die sowohl eine Sperre als auch eine Wartezeit besitzt . In Java kann jeder Objectals Monitor dienen.

Für eine detaillierte Erklärung der Funktionsweise von Monitoren in Java empfehle ich, den Abschnitt Monitor Mechanics der Concurrent Programming in Java zu lesen (der vorhergehende Link zeigt die Vorschau in Google-Büchern an und dieser Abschnitt steht zum Lesen zur Verfügung).


Wie Sie sagten "Ein Monitor ist eine Entität ...", bedeutet dies, dass der Monitor ein internes Objekt / ein interner Zustand ist, der die Sperre und das Warteset besitzt / verfolgt? Wenn nicht, können Sie bitte Entity hier näher erläutern? Grundsätzlich, wenn wir Java Doc Wakes up all threads that are waiting on this object's monitor. über notifyall () sagt , ist das, was ich bekomme, Objekt behält (mit Hilfe der internen Entität / Objekt), was alle Threads auf Sperre warten, diese interne Entität / Objekt wird Monitor genannt?
user3198603

Nützlichste Antwort. Danke @JRL.
Gravetii

Für mich heißt es: "Für diese Seite ist keine Vorschau verfügbar."
Opncow

9
  1. Ein Monitor ist ein Konzept / Mechanismus, der nicht auf die Java-Sprache beschränkt ist.
  2. "Bei der gleichzeitigen Programmierung ist ein Monitor ein Objekt oder Modul, das von mehr als einem Thread sicher verwendet werden soll."
  3. Wie jeder Leser weiß, ist jedes Objekt in Java eine Unterklasse von java.lang.Object. Die Java-Leute haben java.lang.Object so erstellt, dass es Funktionen und Merkmale aufweist, die es Java-Programmierern ermöglichen, jedes Objekt als Monitor zu verwenden. Zum Beispiel hat jedes Objekt eine Warteschlange, eine Wiedereintrittswarteschlange und Warte- und Benachrichtigungsmethoden, die es zu einem Monitor machen.
  4. lesen Sie über Monitore hier .

4

Die Java-Sprache und das Laufzeitsystem unterstützen die Thread-Synchronisation mithilfe von Monitoren.
Ein Monitor ist einem bestimmten Datenelement (einer Bedingungsvariablen) zugeordnet und fungiert als Sperre für diese Daten. Wenn ein Thread den Monitor für ein Datenelement enthält, sind andere Threads gesperrt und können die Daten nicht überprüfen oder ändern.



2

Monitor ist ein Synchronisationskonstrukt, mit dem Threads sowohl gegenseitig ausgeschlossen als auch warten (blockieren) können, bis eine bestimmte Bedingung erfüllt ist.

Monitore verfügen auch über einen Mechanismus zum Signalisieren anderer Threads, dass ihre Bedingung erfüllt wurde. Es ist eine Entität, die sowohl eine Sperre als auch eine Wartezeit besitzt. In Java kann jedes Objekt als Monitor dienen.

In der virtuellen Java-Maschine ist jedes Objekt und jede Klasse einem Monitor logisch zugeordnet. Um die Fähigkeit zum gegenseitigen Ausschluss von Monitoren zu implementieren, wird jedem Objekt und jeder Klasse eine Sperre (manchmal auch als Mutex bezeichnet) zugeordnet. Dies wird in Betriebssystemen als Semaphor bezeichnet, Mutex ist ein binäres Semaphor.

Weitere Informationen finden Sie unter dem Link


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.