首页 > 开发 > Java > 正文

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

2024-07-13 10:12:37
字体:
来源:转载
供稿:网友

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

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

javascript/24792.html">java;">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: %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();   } } 

总结

以上就是本文关于Java多线程之readwritelock读写分离的实现代码的全部内容,希望对大家有所帮助。有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对VeVb武林网网站的支持。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表