• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Java多线程之readwritelock读写分离的实例

java 搞代码 4年前 (2022-01-09) 13次浏览 已收录 0个评论

这篇文章主要介绍了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()<p style="color:transparent">本文来源gao!%daima.com搞$代*!码网1</p>;     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读写分离的实例的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Java多线程之readwritelock读写分离的实例
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址