Heim  >  Artikel  >  Java  >  Java-Multithread-Readwritelock-Beispiel für die Trennung von Lesen und Schreiben

Java-Multithread-Readwritelock-Beispiel für die Trennung von Lesen und Schreiben

黄舟
黄舟Original
2017-10-10 10:23:261407Durchsuche

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn