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


  • 相关阅读:
    WIN7每次从关闭屏幕状态恢复都会挂断宽带连接,请问如何解决?
    程序設計学习之路:不走弯路,就是捷径
    Customize Firefox "Close tab" button
    域名常识
    一到十的英文单词,一十二个月份的英文单词,四季的英文单词,第一,第二第三的英文单词
    Dependency Walker
    刪除當前目錄隱藏文件,非隱藏文件,文件夾等好用的批處理。
    使用 Sandcastle Help File Builder 制作 VS.NET 的 HELP 文件
    字符“23.00”转成int型!Input string was not in a correct format.
    VisualStudio 2010 SP1安装时提示计算机环境导致无法安装的解决办法
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6851565.html
Copyright © 2011-2022 走看看