栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java多线程之readwritelock读写分离的实现代码

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java多线程之readwritelock读写分离的实现代码

在多线程开发中,经常会出现一种情况,我们希望读写分离。就是对于读取这个动作来说,可以同时有多个线程同时去读取这个资源,但是对于写这个动作来说,只能同时有一个线程来操作,而且同时,当有一个写线程在操作这个资源的时候,其他的读线程是不能来操作这个资源的,这样就极大的发挥了多线程的特点,能很好的将多线程的能力发挥出来。

在Java中,ReadWriteLock这个接口就为我们实现了这个需求,通过他的实现类ReentrantReadWriteLock我们可以很简单的来实现刚才的效果,下面我们使用一个例子来说明这个类的用法。

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

下面是读和写两个不同的类

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: %fn", Thread.currentThread() 
   .getName(), pricesInfo.getPrice1()); 
      System.out.printf("%s: Price 2: %fn", 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(); 
  } 
} 

总结

以上就是本文关于Java多线程之readwritelock读写分离的实现代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:Java多线程阻塞与唤醒代码示例 、 Java多线程ForkJoinPool实例详解 、 详解java中的互斥锁信号量和多线程等待机制  、Java通过卖票理解多线程等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对考高分网网站的支持。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/143884.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号