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
(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.
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