zoukankan      html  css  js  c++  java
  • Java多线程之~~~ReadWriteLock 读写分离的多线程实现

    在多线程开发中,常常会出现一种情况,我们希望读写分离。

    就是对于读取这个动作来说,能够同一时候有多个线程同

    时去读取这个资源,可是对于写这个动作来说,仅仅能同一时候有一个线程来操作。并且同一时候,当有一个写线程在操作这个资

    源的时候。其它的读线程是不能来操作这个资源的。这样就极大的发挥了多线程的特点。能非常好的将多线程的能力发挥

    出来。

    在Java中,ReadWriteLock这个接口就为我们实现了这个需求。通过他的实现类ReentrantReadWriteLock我们可

    以非常easy的来实现刚才的效果,以下我们使用一个样例来说明这个类的使用方法。


    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
    ", Thread.currentThread()
    					.getName(), pricesInfo.getPrice1());
    			System.out.printf("%s: Price 2: %f
    ", 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.
    ");
    			pricesInfo.setPrices(Math.random() * 10, Math.random( ) * 8);
    			System.out.printf("Writer: Prices have been modified.
    ");
    			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();
    	}
    }
    


  • 相关阅读:
    求正方形的面积和周长
    面向对象练习——校园管理系统
    python--面向对象(最全讲解)
    git删除远程仓库的文件或目录
    git设置忽略文件和目录
    计算器
    织梦标签整理
    比较恶心的360老年版浏览器 文件导出下载
    织梦文章列表样式多元化实现
    php函数整理
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6851565.html
Copyright © 2011-2022 走看看