Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 8)

javathread.jpeg

Lese- / Schreibsperrmuster

Selbst wenn der Thread den Status der Instanz "liest", ändert sich der Status der Instanz nicht. Es ändert sich, wenn der Prozess des "Schreibens" ausgeführt wird.

Thread lesen: ** Es spielt keine Rolle, ob mehrere Threads gleichzeitig gelesen werden. Aber ich kann beim Lesen nicht schreiben. ** ** **

Schreibfaden: ** Während ein Thread schreibt, kann kein anderer Thread lesen oder schreiben. ** ** **

Im Allgemeinen verringert die exklusive Kontrolle die Leistung, aber die Leistung kann verbessert werden, indem die exklusive Kontrolle für das Schreiben und die exklusive Kontrolle für das separate Lesen berücksichtigt werden.

Erwägen Sie das Lesen und Schreiben von mehreren Threads in eine Instanz einer Klasse namens Data. Wenn ein Thread versucht, eine Sperre zum Lesen zu sichern

  1. Wenn der Thread, den Sie schreiben, bereits vorhanden ist, werden Sie warten müssen.
  2. Sie können es kaum erwarten, ob der Thread, den Sie lesen, bereits vorhanden ist. Wenn ein Thread versucht, eine Sperre zum Schreiben zu sichern
  3. Wenn der Thread, den Sie schreiben, bereits vorhanden ist, werden Sie warten müssen.
  4. Wenn der Thread, den Sie lesen, bereits vorhanden ist, werden Sie warten müssen.

(Den gesamten Code finden Sie in diesem Handbuch.)

ReadWriteLock.java


public final class ReadWriteLock { 
    private int readingReaders = 0;
    private int waitingWriters = 0;
    private int writingWriters = 0;
    private boolean preferWriter = true;
    
    public synchronized void readLock() throws InterruptedException { 
        while (writingWriters > 0 || (preferWriter && waitingWriters > 0)) { 
            wait(); 
        } 
        readingReaders++;
    } 
 
    public synchronized void readUnlock() { 
        readingReaders--;
        preferWriter = true;
        notifyAll(); 
    } 
 
    public synchronized void writeLock() throws InterruptedException { 
        waitingWriters++;
        try { 
            while (readingReaders > 0 || writingWriters > 0) { 
                wait(); 
            } 
        } finally { 
            waitingWriters--;
        } 
        writingWriters++;
    } 
 
    public synchronized void writeUnlock() { 
        writingWriters--;
        preferWriter = false;
        notifyAll(); 
    } 
}

Die Bedeutung des Feldes waitWriters Wenn die Anzahl der ReaderThread-Threads größer als die Anzahl der WriterThread-Threads ist, werden nur Lesevorgänge durchgeführt und Schreibvorgänge sind schwierig. Indem Sie den ReaderThread-Thread warten lassen, wenn waitWriters> 0 gilt, können Sie das Phänomen verhindern, dass WriterThread die Ausführung nicht starten kann.

Die Bedeutung des Feldes "WeideWriter" Wenn Sie jedoch nur auf waitWriters achten, wird möglicherweise verhindert, dass Reader Thread die Ausführung startet. Daher definiert das PreferWriter-Feeling, ob Reader-Thread oder Writer-Thread priorisiert werden sollen. Im Beispielprogramm wird es auf true gesetzt, wenn das Lesen abgeschlossen ist, und auf false, wenn das Schreiben abgeschlossen ist.

Charakter

Leserrolle Die Reader-Rolle liest die SharedResourece-Rolle. Im Beispielprogramm ist dies die ReaderThread-Klasse.

Autorenrolle Die Writer-Rolle schreibt in die SharedResourece-Rolle. Im Beispielprogramm ist dies die WriterThread-Klasse.

Shared Resource-Rolle Die SharedResource-Rolle stellt eine Ressource dar, die von der Redaer-Rolle und der Writer-Rolle gemeinsam genutzt wird. Die SharedResource-Rolle bietet einen Prozess, der den internen Status nicht ändert (Lesen), und einen Prozess, der den internen Status ändert (Schreiben). Im Beispielprogramm ist dies die Datenklasse.

ReadWriteLock-Rolle Die ReadWriteLock-Rolle bietet eine Sperre für die SharedResource-Rolle, um die Lese- und Schreibverarbeitung zu realisieren. Im Beispielprogramm ist dies die ReadWriteLock-Klasse.


Beziehung Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithreaded Edition) "(Teil 1) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multi-Thread-Edition) "(Teil 2) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multi-Thread-Edition) "(Teil 3) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multi-Thread-Edition) "(Teil 4) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithreaded Edition) "(Teil 5) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithread Edition) "(Teil 6) Zusammenfassung der in Java-Sprache erlernten Entwurfsmuster (Multithread Edition) "(Teil 7)

Recommended Posts

Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 10)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 7)
Zusammenfassung von "In Java gelernte Entwurfsmuster (Multithread Edition)" (Teil 3)
Zusammenfassung von "In Java gelernten Entwurfsmustern (Multithread Edition)" (Teil 6)
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
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)