In diesem Artikel wird hauptsächlich der relevante Inhalt der Readwritelock-Trennung von Java Multithreading vorgestellt. Der Artikel enthält spezifische Beispielcodes, die einen bestimmten Referenzwert haben.
Bei der Multithread-Entwicklung gibt es oft eine Situation, in der wir Lesen und Schreiben trennen möchten. Für die Leseaktion können mehrere Threads gleichzeitig die Ressource lesen, für die Schreibaktion kann jedoch nur ein Thread gleichzeitig ausgeführt werden, und wenn ein Schreibthread vorhanden ist, der diese Aktion ausführt, kann er gleichzeitig auf eine Ressource zugreifen , andere Lesethreads können diese Ressource nicht bedienen. Dadurch werden die Eigenschaften des Multithreadings erheblich maximiert und die Funktionen des Multithreadings können vollständig genutzt werden.
In Java realisiert die ReadWriteLock-Schnittstelle diese Anforderung durch ihre Implementierungsklasse ReentrantReadWriteLock. Lassen Sie uns den Effekt gerade jetzt anhand eines Beispiels veranschaulichen.
package com.bird.concursey.charpet3; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class PricesInfo { private double price1; private double price2; private ReadWriteLock lock; public PricesInfo() { price1 = 1.0; price2 = 2.0; lock = new ReentrantReadWriteLock(); } public double getPrice1() { //读取资源锁定 lock.readLock().lock(); double value = price1; lock.readLock().unlock(); return value; } public double getPrice2() { lock.readLock().lock(); double value = price2; lock.readLock().unlock(); return value; } public void setPrices(double price1, double price2) { lock.writeLock().lock(); this.price1 = price1; this.price2 = price2; lock.writeLock().unlock(); } }
Im Folgenden finden Sie zwei verschiedene Kurse für Lesen und Schreiben
package com.bird.concursey.charpet3; public class Reader implements Runnable { private PricesInfo pricesInfo; public Reader(PricesInfo pricesInfo) { this.pricesInfo = pricesInfo; } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.printf("%s: Price 1: %f\n", Thread.currentThread() .getName(), pricesInfo.getPrice1()); System.out.printf("%s: Price 2: %f\n", Thread.currentThread() .getName(), pricesInfo.getPrice2()); } } }
package com.bird.concursey.charpet3; public class Writer implements Runnable { private PricesInfo pricesInfo; public Writer(PricesInfo pricesInfo) { this.pricesInfo = pricesInfo; } @Override public void run() { for (int i = 0; i < 3; i++) { System.out.printf("Writer: Attempt to modify the prices.\n"); pricesInfo.setPrices(Math.random() * 10, Math.random( ) * 8); System.out.printf("Writer: Prices have been modified.\n"); try { Thread.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { PricesInfo pricesInfo = new PricesInfo(); Reader readers[] = new Reader[5]; Thread threadsReader[] = new Thread[5]; for (int i = 0; i < 5; i++){ readers[i] = new Reader(pricesInfo); threadsReader[i] = new Thread(readers[i]); } Writer writer = new Writer(pricesInfo); Thread threadWriter = new Thread(writer); for (int i = 0; i < 5; i++){ threadsReader[i].start(); } threadWriter.start(); } }
Zusammenfassung
Das obige ist der detaillierte Inhalt vonJava-Multithread-Readwritelock-Beispiel für die Trennung von Lesen und Schreiben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!