Zusammenfassung von "In Java gelernte Entwurfsmuster (Multithread Edition)" (Teil 3)

javathread.jpeg

Single Threaded Execution Pattern

Ein Muster, das die Verarbeitung einschränkt, sodass jeweils nur ein Thread ausgeführt werden kann. Das Single Threaded Execution-Muster wird manchmal als ** Kritischer Abschnitt ** oder ** Kritischer Bereich ** bezeichnet.

(Code, der wie beabsichtigt funktioniert und Code, der nicht wie beabsichtigt funktioniert)

Charakter

Im Single Threaded Execution-Muster wird eine Klasse mit der Rolle ** Shared Resourece ** angezeigt. Die SharedResourece-Rolle verfügt über mehrere Methoden, die in die folgenden zwei Typen unterteilt sind.

--safeMethod: Eine Methode, die problemlos von mehreren Threads gleichzeitig aufgerufen werden kann. --unsafeMethod: Eine Methode, die geschützt werden muss, da nicht mehrere Threads gleichzeitig aufrufen können.

Das Single Threaded Execution-Muster schützt unsaMetMethad so, dass jeweils nur ein Thread darauf zugreifen kann. In Java wird das Schützen realisiert, indem es zu einer synchronisierten Methode gemacht wird. Der Bereich, der in einem einzelnen Thread betrieben werden muss, wird als ** kritischer Abschnitt ** bezeichnet.

Wann zu verwenden

Java bietet übrigens eine Methode, um die Auflistungsklasse threadsicher zu machen.

--synchronizedCollection-Methode --synchronizedList-Methode --synchronizedMap-Methode --synchronizedSet-Methode --synchronizedSortedMap-Methode --synchronizedSoretedSet-Methode

Überlebensfähigkeit und Dead Lock

** Dies ist sehr wichtig, schreiben Sie es daher sorgfältig. ** ** **

Ein Deadlock bei der Ausführung mit einem Thread tritt auf, wenn alle folgenden Bedingungen erfüllt sind:

  1. Es gibt mehrere SharedResource-Rollen.
  2. Der Thread ruft die Sperre einer anderen SharedResource-Rolle ab, während die Sperre einer SharedResource-Rolle beibehalten wird.
  3. Die Reihenfolge des Sperren der SharedResource-Rolle ist nicht festgelegt.

Angenommen, A und B essen den Reis vor sich. Sie brauchen sowohl einen Löffel als auch eine Gabel, um zu essen. Angenommen, A nimmt einen Löffel und B nimmt eine Gabel. Zu diesem Zeitpunkt wartet A darauf, dass B die Gabel setzt, und B wartet darauf, dass A den Löffel setzt. Dead Lock tritt auf. In diesem Beispiel

  1. Es gibt mehrere SharedResource-Rollen, Löffel und Gabel.
  2. Wenn Sie versuchen, die Gabel des Gegners zu halten, während Sie den Löffel halten, versuchen Sie, ein weiteres Schloss zu bekommen, während Sie das Schloss halten.
  3. Dieses Mal kann die Reihenfolge von Löffel → Gabel oder Gabel → Löffel verwendet werden, sodass die Reihenfolge der Verriegelung nicht festgelegt wird.

Daher ist eine Deadlock aufgetreten. Versuchen Sie in diesem Beispiel, entweder Bedingung 1 oder 2 oder 3 zu brechen.

Versuchen Sie, 1 zu brechen. Sie brauchen nur einen Löffel zum Essen. Damit tritt keine Deadlock auf. Versuchen Sie, 2 zu brechen. Hör auf, die Gabel zu holen, während du den Löffel hältst. Wenn Sie mit einem Löffel essen können, essen Sie mit einem Löffel. Wenn Sie mit dem Essen fertig sind, setzen Sie den Löffel einmal ein und holen Sie sich die nächste Gabel. Dies führt nicht zu einem Dead Lock. Versuche 3 zu brechen. Stellen Sie sicher, dass Sie den Löffel und die Gabel in dieser Reihenfolge nehmen müssen. Wenn A dann den Löffel aufnimmt, kann A die Gabel aufheben, weil B warten muss, bis der Löffel platziert ist (weil B die Gabel niemals aufnimmt). Es tritt keine Deadlock auf.

Wiederverwendbarkeits- und Vererbungsanomalien

Selbst wenn die SharedResource-Rolle genau zur Gewährleistung der Sicherheit erstellt wird, besteht das Risiko, dass die Sicherheit durch Unterklassen zerstört wird. Vererbung kann bei der Multithread-Programmierung zu problematischen Problemen führen. Dies wird als ** Vererbungsfehler ** bezeichnet.

Kritische Abschnittsgröße und Leistung

Im Allgemeinen verschlechtert das Single Threaded Execution-Muster die Leistung.

Denken Sie an synchronisiert

Ist der folgende Code beispielsweise der gleiche wie der Code, der synchronisiert verwendet wird?

void method() {
    lock(); //Angenommen, es gibt eine solche Methode
    ...
    unlock(); //Angenommen, es gibt eine solche Methode
}

Die Antwort ist nicht dieselbe. Dies liegt daran, dass die Sperre nicht freigegeben wird, wenn eine Rückgabe- oder Ausnahmebehandlung zwischen lock () und entsperren () ausgeführt wird. Auf der anderen Seite lösen die synchronisierte Methode und der synchronisierte Block die Sperre beim Beenden von {}. Unabhängig davon, ob Sie eine Ausnahme in der Mitte zurückgeben oder auslösen, wird die Sperre mit Sicherheit aufgehoben. Wenn Sie zwei Methoden wie lock () und entsperren () haben und unabhängig (was passiert) Unlock () aufrufen möchten, verwenden Sie ** finally **.

void method
    lock();
    try {
        ...
    } finally {
        unlock(); //Endlich entsperren
    }
}

Wie man es endlich so benutzt, ist eine der Möglichkeiten, ** Vorher / Nachher-Muster ** zu realisieren.

Beachten Sie Folgendes für synchronisierte Methoden und synchronisierte Blöcke.

――Was schützen Sie?

Atombetrieb

Substitutionen und Referenzen für primitiven Typ und Referenztyp sind ** atomar **. Das heißt, wenn ein Thread eine Zuweisung von n = 123 und ein anderer Thread eine Zuweisung von n = 456 vornimmt, ist n immer 123 oder 456. Gemäß den Java-Sprachspezifikationen sind lange und doppelte Zuweisungen und Referenzen jedoch nicht atomar. In der Realität werden viele Java-Sprachverarbeitungssysteme sowohl lange als auch doppelte atomare Operationen implementieren. Mit dem Schlüsselwort ** volatile ** wird die Operation in diesem Feld atomar.

Semapho zählen

Single Threaded Execution ist ein Muster, bei dem nur "nur ein Thread" einen bestimmten Bereich ausführt. ** Semapho zählen * ermöglicht die Ausführung eines bestimmten Bereichs bis zu "bis zu N Threads". Das Paket ** java.util.concurrent ** enthält die Klasse ** Semaphore ** zum Zählen von Semaphos. Geben Sie die Anzahl der Ressourcen (Genehmigungen) im Konstruktor von Semaphore an. Weisen Sie Ressourcen mit der ** Erwerb ** -Methode von Semaphore zu und geben Sie die Freigabe mit der ** Freigabemethode ** frei. Acquire und Release müssen immer paarweise aufgerufen werden. Daher wird empfohlen, das oben erwähnte Vorher / Nachher-Muster endgültig zu verwenden.


Beziehung Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multi-Thread-Edition) "(Teil 1) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithreaded Edition) "(Teil 2)

Recommended Posts

Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 10)
Zusammenfassung von "In Java gelernte Entwurfsmuster (Multithread Edition)" (Teil 3)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 9)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 6)
Zusammenfassung von "In Java gelernte Entwurfsmuster (Multithread Edition)" (Teil 4)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 5)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 2)
Zusammenfassung von "In Java-Sprache erlernte Entwurfsmuster (Multi-Thread-Edition)" (Teil 1)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 11)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 12)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 8)
[Java] Zusammenfassung der Entwurfsmuster
Ein kurzer Überblick über Java, das in Klasse 4 gelernt wurde
Zusammenfassung der Grundlagen der Java-Sprache
Ein kurzer Überblick über Java, das in Klasse 3 gelernt wurde
Ein kurzer Überblick über Java, das in Klasse 2 gelernt wurde
Ich las Hiroshi Yuki "Einführung in Designmuster, die in Java gelernt wurden" (SB Creative)
Java-Entwurfsmuster
Was ich in Java gelernt habe (Teil 2) Was sind Variablen?
Ein kurzer Überblick über Java, das im Unterricht gelernt wurde
Zusammenfassung dessen, was ich in Spring Batch gelernt habe
Probieren Sie Designmuster in C-Sprache aus! Erinnerungsmuster - merken wir uns die Speicher der Daten
[Java] Grundlegende Zusammenfassung von Java, die nicht von Progate abgedeckt wird ~ Teil 1 ~
Was ich in Java gelernt habe (Teil 3) Anweisung zur Ausführung von Anweisungen
Zusammenfassung der Implementierung von Standardargumenten in Java
Zusammenfassung der Java-Unterstützung 2018
Zusammenfassung des Java-Entwurfsmusters
Was ich in Java gelernt habe (Teil 4) Bedingte Verzweigung und Wiederholung
[Java] Grundlegende Zusammenfassung von Java, die nicht von Progate abgedeckt wird ~ Teil 2 ・ Liste ~
Road to Java Engineer Part2 Was für eine Sprache ist Java?
[Java11] Stream-Zusammenfassung - Vorteile von Stream -
[Java] Zusammenfassung der regulären Ausdrücke
[Java] Zusammenfassung der Operatoren (Operator)
Zusammenfassung der Java Math Klasse
[Java] Zusammenfassung der Steuerungssyntax
Java-Implementierung von Tri-Tree
Zusammenfassung der Java-Fehlerverarbeitung
[Java] Zusammenfassung der mathematischen Operationen
Was ich in Java gelernt habe (Teil 1) Java-Entwicklungsablauf und Überblick
Zusammenfassung von ORM "uroboroSQL", das in Enterprise Java verwendet werden kann
[Für Anfänger] Zusammenfassung des Java-Konstruktors
Zusammenfassung des Pakets [Java Silver Study]
Grundlegende Verwendung von Java Optionaler Teil 1
Thread-sicherer Prozess in Java-Sprache
AtCoder 400 Punkte Algorithmus Zusammenfassung (Java Edition)
Liste der in Java 9 hinzugefügten Mitglieder
Führen Sie eine Phrasenanalyse in Java 8 durch (Teil 2).
Liste der in Java 9 hinzugefügten Typen
Zusammenfassung der objektorientierten Programmierung mit Java
Implementierung einer ähnlichen Funktion in Java
Erstellen einer Phrasenanalyse in Java 8 (Teil 1)