Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 8)

javathread.jpeg

Modèle de verrouillage en lecture-écriture

Même si le thread "lit" l'état de l'instance, l'état de l'instance ne change pas. Il change lorsque le processus "d'écriture" est effectué.

Lire le fil: ** Peu importe si plusieurs threads sont lus en même temps. Mais je ne peux pas écrire en lisant. ** **

Fil d'écriture: ** Pendant qu'un thread est en train d'écrire, aucun autre thread ne peut lire ou écrire. ** **

En général, le contrôle exclusif réduit les performances, mais les performances peuvent être améliorées en considérant séparément le contrôle exclusif pour l'écriture et le contrôle exclusif pour la lecture.

Envisagez de lire et d'écrire à partir de plusieurs threads vers une instance d'une classe appelée Data. Lorsqu'un thread tente de sécuriser un verrou pour lire

  1. Si le fil que vous écrivez existe déjà, vous serez en attente.
  2. Vous ne pouvez pas attendre si le fil que vous lisez existe déjà. Lorsqu'un thread tente de sécuriser un verrou pour écrire
  3. Si le fil que vous écrivez existe déjà, vous serez en attente.
  4. Si le fil que vous lisez existe déjà, vous serez en attente.

(Voir ce manuel pour le code complet)

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(); 
    } 
}

L'importance du champ WaitWriters Si le nombre de threads ReaderThread est supérieur au nombre de threads WriterThread, seules les lectures seront effectuées et les écritures seront difficiles. En faisant attendre le thread ReaderThread lorsque waitWriters> 0 tient, il est possible d'éviter le phénomène selon lequel WriterThread ne peut pas démarrer l'exécution.

La signification du champ preferWriter Cependant, le simple fait de considérer waitWriters peut empêcher Reader Thread de démarrer l'exécution. Par conséquent, la sensation preferWriter définit s'il faut donner la priorité à Reader Thread ou Writer Thread. Dans l'exemple de programme, il est défini sur true lorsque la lecture est terminée et false lorsque l'écriture est terminée.

Personnage

Rôle du lecteur Le rôle Reader lit le rôle SharedResourece. Dans l'exemple de programme, il s'agit de la classe ReaderThread.

Rôle d'écrivain Le rôle Writer écrit dans le rôle SharedResourece. Dans l'exemple de programme, il s'agit de la classe WriterThread.

Rôle de ressource partagée Le rôle SharedResource représente une ressource partagée par le rôle Redaer et le rôle Writer. Le rôle SharedResource fournit un processus qui ne modifie pas l'état interne (lecture) et un processus qui modifie l'état interne (écriture). Dans l'exemple de programme, il s'agit de la classe Data.

Rôle ReadWriteLock Le rôle ReadWriteLock fournit un verrou pour le rôle SharedResource pour réaliser le traitement de lecture et le traitement d'écriture. Dans l'exemple de programme, il s'agit de la classe ReadWriteLock.


Relation Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 1) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 2) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 3) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 4) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 5) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 6) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 7)

Recommended Posts

Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 10)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 7)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 3)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 6)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 5)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 2)
Résumé de «Modèles de conception appris en langage Java (édition multi-thread)» (Partie 1)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 11)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 12)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 8)
[Java] Résumé des modèles de conception
Un examen rapide de Java appris en classe part4
Résumé des bases du langage Java
Un examen rapide de Java appris en classe part3
Un examen rapide de Java appris en classe part2
J'ai lu Hiroshi Yuki "Introduction aux modèles de conception appris en langage Java" (SB Creative)
Modèles de conception Java
Ce que j'ai appris en Java (partie 2) Que sont les variables?
Un examen rapide de Java appris en classe
Résumé de ce que j'ai appris dans Spring Batch
Essayez les modèles de conception en langage C! Modèle de souvenir - mémorisons les souvenirs des données
[Java] Résumé de base de Java non couvert par Progate ~ Partie 1 ~
Ce que j'ai appris en Java (partie 3) Déclaration d'exécution des instructions
Résumé de la mise en œuvre des arguments par défaut en Java
Résumé du support Java 2018
Résumé du modèle de conception Java
Ce que j'ai appris en Java (partie 4) Branchement conditionnel et répétition
[Java] Résumé de base de Java non couvert par Progate ~ Partie 2 ・ Liste ~
Road to Java Engineer Part2 Quel type de langage est Java?
[Java11] Résumé du flux -Avantages du flux-
[Java] Résumé des expressions régulières
[Java] Résumé des opérateurs (opérateur)
Résumé de la classe Java Math
[Java] Résumé de la syntaxe de contrôle
Implémentation Java de tri-tree
Résumé du traitement des erreurs Java
[Java] Résumé des opérations mathématiques
Ce que j'ai appris en Java (partie 1) Flux de développement Java et présentation
Résumé de l'ORM "uroboroSQL" qui peut être utilisé dans le Java d'entreprise
[Pour les débutants] Résumé du constructeur java
Résumé du package [Java Silver Study]
Utilisation de base de Java Facultatif Partie 1
Résumé de l'algorithme AtCoder 400 points (édition Java)
Liste des membres ajoutés dans Java 9
Faire une analyse de phrase en Java 8 (partie 2)
Liste des types ajoutés dans Java 9
Résumé de la programmation orientée objet utilisant Java
Implémentation d'une fonction similaire en Java
Création d'une analyse de phrase dans Java 8 (partie 1)