Der Inhalt dieses Artikels handelt davon, was „Monitor“ bedeutet. Die Einführung von Monitor in Java hat einen gewissen Referenzwert. Ich hoffe, dass es für Sie hilfreich ist.
Monitor wird im Englischen auch oft als „Monitor“ übersetzt, ob als „Monitor“ oder „Monitor“ übersetzt, ein obskurer Vergleich, durch übersetztes Chinesisch, Es ist unmöglich, eine intuitive Beschreibung des Monitors zu erreichen.
In diesem Artikel „Betriebssystem-Synchronisationsprimitive“ werden einige vom Betriebssystem unterstützte Synchronisationsprimitive vorgestellt, darunter Semaphor-Semaphore und Mutex-Mutex.
Bei der Verwendung von Basis-Mutex zur Parallelitätskontrolle müssen Programmierer sehr vorsichtig sein, um die Down- und Up-Operationen des Mutex zu kontrollieren, da es sonst leicht zu Problemen wie Deadlocks kommen kann. Um das Schreiben korrekter gleichzeitiger Programme zu erleichtern, wird ein übergeordneter Synchronisationsprimitivmonitor vorgeschlagen, der auf Mutex und Semaphor basiert. Es ist jedoch zu beachten, dass das Betriebssystem selbst den Monitormechanismus nicht unterstützt gehört zur Kategorie der Programmiersprachen. Wenn Sie Monitor verwenden möchten, prüfen Sie zunächst, ob die Sprache selbst Monitor-Primitive unterstützt. Die C-Sprache unterstützt beispielsweise Monitor nicht.
Der allgemeine Monitor-Implementierungsmodus besteht darin, dass die Programmiersprache syntaktischen Zucker in der Syntax bereitstellt und die Implementierung des Monitormechanismus Aufgabe des Compilers ist.
Das wichtige Merkmal von Monitor besteht darin, dass nur ein Prozess/Thread gleichzeitig in den im Monitor definierten kritischen Abschnitt gelangen kann, wodurch Monitor einen gegenseitigen Ausschlusseffekt erzielen kann. Ein gegenseitiger Ausschluss reicht jedoch nicht aus. Prozesse/Threads, die nicht in den kritischen Bereich des Monitors gelangen können, sollten blockiert und bei Bedarf aktiviert werden. Als Synchronisierungstool sollte der Monitor natürlich auch einen solchen Mechanismus zur Verwaltung des Prozess-/Thread-Status bereitstellen. Denken Sie darüber nach, warum wir glauben, dass Semaphore und Mutex in der Programmierung fehleranfällig sind, weil wir Variablen persönlich manipulieren und Prozesse/Threads blockieren und aktivieren müssen. Der Grund, warum der Monitormechanismus als „Primitiv auf höherer Ebene“ bezeichnet wird, besteht darin, dass er diese Mechanismen zwangsläufig von außen abschirmen und intern implementieren muss, damit Personen, die den Monitor verwenden, eine einfache und benutzerfreundliche Schnittstelle sehen .
Der Überwachungsmechanismus erfordert das Zusammenwirken mehrerer Elemente, nämlich:
Kritischer Abschnitt
Objekt überwachen und sperren
Bedingungsvariablen und Warte- und Signaloperationen, die für das Überwachungsobjekt definiert sind.
Der Hauptzweck der Verwendung des Monitormechanismus besteht darin, den Eintritt in den kritischen Abschnitt gegenseitig auszuschließen. Um Prozesse/Threads zu blockieren, die nicht in den kritischen Abschnitt gelangen können, ist ein Monitorobjekt erforderlich Dieser Monitor verfügt über entsprechende Datenstrukturen innerhalb des Objekts, z. B. Listen, um gleichzeitig blockierte Threads zu speichern. Da der Monitormechanismus im Wesentlichen auf dem grundlegenden primitiven Mutex basiert, muss das Monitorobjekt auch einen Mutex verwalten. basierendes Schloss.
Um den Prozess/Thread zum richtigen Zeitpunkt blockieren und aktivieren zu können, muss eine Bedingungsvariable eingeführt werden, um zu bestimmen, wann der „geeignete Zeitpunkt“ ist kann aus der Logik des Programmcodes stammen oder sich im Monitorobjekt befinden. Kurz gesagt, der Programmierer verfügt über große Autonomie bei der Definition von Bedingungsvariablen. Da das Monitorobjekt jedoch eine interne Datenstruktur zum Speichern der blockierten Warteschlange verwendet, muss es auch zwei externe APIs bereitstellen, damit der Thread in den blockierten Zustand wechseln und später aufwachen kann, nämlich Warten und Benachrichtigen.
Monitor ist ein vom Betriebssystem vorgeschlagenes Grundelement auf hoher Ebene, sein spezifischer Implementierungsmodus kann jedoch in verschiedenen Programmiersprachen unterschiedlich sein. Im Folgenden wird am Beispiel des Monitors von Java erläutert, wie der Monitor in Java implementiert wird.
In Java kann das synchronisierte Schlüsselwort zum Ändern von Instanzmethoden, Klassenmethoden und Codeblöcken verwendet werden, wie unten gezeigt:
/** * @author beanlam * @version 1.0 * @date 2018/9/12 */ public class Monitor { private Object ANOTHER_LOCK = new Object(); private synchronized void fun1() { } public static synchronized void fun2() { } public void fun3() { synchronized (this) { } } public void fun4() { synchronized (ANOTHER_LOCK) { } } }
ist der synchronisierte Schlüssel Wortmodifizierte Methoden und Codeblöcke sind die kritischen Abschnitte des Überwachungsmechanismus.
Bei Verwendung des oben genannten synchronisierten Schlüsselworts müssen Sie häufig ein Objekt angeben, das ihm zugeordnet werden soll, z. B. synchronisiert (dies) oder synchronisiert (ANOTHER_LOCK, wenn synchronisiert). Wenn es sich um eine Instanzmethode handelt, ist das zugehörige Objekt tatsächlich this. Wenn es sich um eine Klassenmethode handelt, ist das zugehörige Objekt this.class. Kurz gesagt, synchronisiert muss einem Objekt zugeordnet werden, und dieses Objekt ist das Überwachungsobjekt.
Im Monitormechanismus spielt das Monitorobjekt die Rolle, den Mutex aufrechtzuerhalten und die Warte-/Signal-API zu definieren, um das Blockieren und Aufwecken von Threads zu verwalten.
Die Klasse java.lang.Object in der Java-Sprache ist das Objekt, das diese Anforderung erfüllt. Jedes Java-Objekt kann als Monitorobjekt des Monitormechanismus verwendet werden.
Java-Objekte werden im Speicher gespeichert und sind in drei Teile unterteilt, nämlich Objektheader, Instanzdaten und Ausrichtungsfüllung. In ihrem Objektheader wird gleichzeitig die Sperrkennung gespeichert, die die Klasse java.lang.Object definiert Die Methoden wait (), notify () und notifyAll () basieren auf einer Implementierung namens ObjectMonitor-Modus, bei der es sich um eine Reihe von Mechanismen handelt, die in der auf C++ basierenden JVM implementiert sind. Das Grundprinzip lautet wie folgt:
Wenn ein Thread die Sperre eines Objekts erhalten muss, wird es in das EntrySet gestellt, um zu warten. Wenn der Thread die Sperre erhält, wird dies der Fall sein Werden Sie Eigentümer des aktuellen Schlosses. Wenn gemäß der Programmlogik einem Thread, der die Sperre erhalten hat, einige externe Bedingungen fehlen und er nicht fortfahren kann (z. B. stellt der Produzent fest, dass die Warteschlange voll ist, oder der Verbraucher stellt fest, dass die Warteschlange leer ist), kann der Thread die übertragen Sperren Sie, indem Sie die Wartemethode aufrufen und den Wartesatz zum Blockieren und Warten eingeben. Zu diesem Zeitpunkt haben andere Threads die Möglichkeit, die Sperre zu erhalten und andere Dinge zu tun, sodass die zuvor nicht festgelegten externen Bedingungen hergestellt werden dass die zuvor blockierten Threads erneut in das EntrySet eintreten können, um um die Sperre zu konkurrieren. Diese externe Bedingung wird im Monitormechanismus als Bedingungsvariable bezeichnet.
Das synchronisierte Schlüsselwort ist ein wichtiges Tool, das Java auf Syntaxebene verwendet, um Entwicklern eine einfache Multithread-Synchronisierung zu ermöglichen. Um eine Methode oder einen Codeblock einzugeben, der durch eine synchronisierte Methode geändert wurde, wird zunächst die Objektsperre des an das synchronisierte Schlüsselwort gebundenen Objekts abgerufen. Diese Sperre verhindert auch, dass andere Threads andere synchronisierte Codebereiche betreten, die mit dieser Sperre zusammenhängen.
Viele Artikel und Informationen im Internet sagen bei der Analyse des Prinzips der Synchronisierung grundsätzlich, dass die Synchronisierung auf der Grundlage des Überwachungsmechanismus implementiert wird, aber nur wenige Artikel machen dies klar und sind alle vage.
Welche Elemente entsprechen den zuvor erwähnten Grundelementen von Monitor, wenn die Synchronisierung auf der Grundlage des Monitormechanismus implementiert wird?
Es muss einen kritischen Abschnitt geben. Wir können uns den kritischen Abschnitt hier als P- oder V-Operation für den Objekt-Header-Mutex vorstellen.
Wem entspricht das Monitorobjekt? Mutex? Kurz gesagt, das tatsächliche Monitorobjekt kann nicht gefunden werden.
Daher halte ich die Aussage „synchronisiert wird basierend auf dem Monitormechanismus implementiert“ für falsch und mehrdeutig.
Der von Java bereitgestellte Überwachungsmechanismus wird tatsächlich durch die Zusammenarbeit von Objekt-, synchronisierten und anderen Elementen gebildet. Auch externe Bedingungsvariablen sind eine Komponente. Der zugrunde liegende ObjectMonitor der JVM ist lediglich ein allgemeiner Modus, der zur Unterstützung der Implementierung des Überwachungsmechanismus verwendet wird. In den meisten Artikeln wird ObjectMonitor jedoch direkt als Überwachungsmechanismus betrachtet.
Ich denke, es sollte so verstanden werden: Javas Unterstützung für Monitore wird Entwicklern auf der Granularität des Mechanismus bereitgestellt. Das heißt, Entwickler müssen das synchronisierte Schlüsselwort in Kombination mit Elementen wie „wait/notify“ von Object verwenden. Er sagte, dass er den Überwachungsmechanismus verwendet habe, um ein Produzenten-Konsumenten-Problem zu lösen.
Das obige ist der detaillierte Inhalt vonWas bedeutet Monitor? Einführung in Monitor in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!