zoukankan      html  css  js  c++  java
  • java读写锁实现数据同步访问

    锁机制最大的改进之一就是ReadWriteLock接口和它的唯一实现类ReentrantReadWriteLock。这个类有两个锁,一个是读操作锁,另一个是写操作锁。使用读操作锁时可以允许多个线程同时访问,但是使用写操作锁时只允许一个线程进行。在一个线程执行写操作时,其他线程不能够执行读操作。

      下面我们将通过范例学习如何使用ReadWriteLock接口编写程序。这个范例将使用ReadWriteLock接口控制对价格对象的访问,价格对象存储了两个产品的价格。

    1. 创建一个价格信息类PricesInfo,并且存放两个产品的价格。

    复制代码
    import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    
    
    public class PricesInfo {
        //两个价格
        private double price1;
        private double price2;
        //声明读写锁ReadWriteLock对象lock
        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();
        }
        
    }
    复制代码

    2. 创建读取类Reader,它实现了Runnable接口。

    复制代码
    public class Reader implements Runnable {
        private PricesInfo pricesInfo;
        public Reader(PricesInfo pricesInfo){
            this.pricesInfo = pricesInfo;
        }
        @Override
        public void run() {
            // 循环读取连个价格10次
            for(int i=0;i<10;i++){
                System.out.printf("%s: Price1: %f
    ", Thread.currentThread().getName(), pricesInfo.getPrice1());
                System.out.printf("%s: Price2: %f
    ", Thread.currentThread().getName(), pricesInfo.getPrice2());
            }
    
        }
    
    }
    复制代码

    3. 创建写入类Writer,它实现了Runnable接口。

    复制代码
    public class Writer implements Runnable {
        private PricesInfo pricesInfo;
        public Writer(PricesInfo pricesInfo){
            this.pricesInfo = pricesInfo;
        }
        @Override
        public void run() {
            // 循环修改两个价格3次
            try {
                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.println("Writer: Prices have been modified.");
                    Thread.sleep(2);
                }
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
    
    }
    复制代码

    4. 创建范例的主类Main

    复制代码
    public class Main {
    
        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();
        }
    }
    复制代码

    5. 程序运行结果如下

    复制代码
    Thread-1: Price1: 1.000000
    Thread-4: Price1: 1.000000
    Thread-2: Price1: 1.000000
    Thread-2: Price2: 2.000000
    Thread-2: Price1: 1.000000
    Thread-2: Price2: 2.000000
    Thread-0: Price1: 1.000000
    Thread-0: Price2: 2.000000
    Thread-0: Price1: 1.000000
    Thread-0: Price2: 2.000000
    Thread-0: Price1: 1.000000
    Thread-0: Price2: 2.000000
    Thread-0: Price1: 1.000000
    Thread-0: Price2: 2.000000
    Thread-0: Price1: 1.000000
    Thread-0: Price2: 2.000000
    Thread-0: Price1: 1.000000
    Thread-0: Price2: 2.000000
    Thread-0: Price1: 1.000000
    Thread-0: Price2: 2.000000
    Thread-0: Price1: 1.000000
    Thread-0: Price2: 2.000000
    Thread-0: Price1: 1.000000
    Thread-0: Price2: 2.000000
    Thread-0: Price1: 1.000000
    Thread-0: Price2: 2.000000
    Thread-2: Price1: 1.000000
    Thread-2: Price2: 2.000000
    Writer: Attempt to modify the prices.
    Writer: Prices have been modified.
    Thread-3: Price1: 1.000000
    Thread-3: Price2: 4.840562
    Thread-1: Price2: 2.000000
    Thread-1: Price1: 6.220535
    Thread-1: Price2: 4.840562
    Thread-1: Price1: 6.220535
    Thread-1: Price2: 4.840562
    Thread-1: Price1: 6.220535
    Thread-1: Price2: 4.840562
    Thread-1: Price1: 6.220535
    Thread-1: Price2: 4.840562
    Thread-1: Price1: 6.220535
    Thread-1: Price2: 4.840562
    Thread-1: Price1: 6.220535
    Thread-1: Price2: 4.840562
    Thread-1: Price1: 6.220535
    Thread-1: Price2: 4.840562
    Thread-1: Price1: 6.220535
    Thread-1: Price2: 4.840562
    Thread-1: Price1: 6.220535
    Thread-1: Price2: 4.840562
    Writer: Attempt to modify the prices.
    Writer: Prices have been modified.
    Thread-4: Price2: 2.000000
    Thread-4: Price1: 5.640719
    Thread-4: Price2: 1.872038
    Thread-4: Price1: 5.640719
    Thread-4: Price2: 1.872038
    Thread-2: Price1: 6.220535
    Thread-2: Price2: 1.872038
    Thread-2: Price1: 5.640719
    Thread-2: Price2: 1.872038
    Thread-2: Price1: 5.640719
    Thread-2: Price2: 1.872038
    Thread-2: Price1: 5.640719
    Thread-2: Price2: 1.872038
    Thread-2: Price1: 5.640719
    Thread-2: Price2: 1.872038
    Thread-2: Price1: 5.640719
    Thread-2: Price2: 1.872038
    Thread-2: Price1: 5.640719
    Thread-2: Price2: 1.872038
    Thread-3: Price1: 5.640719
    Thread-3: Price2: 1.872038
    Thread-3: Price1: 5.640719
    Thread-3: Price2: 1.872038
    Thread-3: Price1: 5.640719
    Thread-3: Price2: 1.872038
    Thread-3: Price1: 5.640719
    Thread-3: Price2: 1.872038
    Thread-3: Price1: 5.640719
    Thread-3: Price2: 1.872038
    Thread-3: Price1: 5.640719
    Thread-3: Price2: 1.872038
    Thread-3: Price1: 5.640719
    Thread-3: Price2: 1.872038
    Thread-3: Price1: 5.640719
    Thread-3: Price2: 1.872038
    Thread-3: Price1: 5.640719
    Thread-3: Price2: 1.872038
    Writer: Attempt to modify the prices.
    Writer: Prices have been modified.
    Thread-4: Price1: 5.491746
    Thread-4: Price2: 2.729420
    Thread-4: Price1: 5.491746
    Thread-4: Price2: 2.729420
    Thread-4: Price1: 5.491746
    Thread-4: Price2: 2.729420
    Thread-4: Price1: 5.491746
    Thread-4: Price2: 2.729420
    Thread-4: Price1: 5.491746
    Thread-4: Price2: 2.729420
    Thread-4: Price1: 5.491746
    Thread-4: Price2: 2.729420
    Thread-4: Price1: 5.491746
    Thread-4: Price2: 2.729420
    复制代码
  • 相关阅读:
    两个链表的第一个公共节点
    笔试题总结
    SMTP协议分析
    用两个栈实现一个队列
    医院Android项目总结
    C标准I/O库函数与Unbuffered I/O函数
    ELF文件
    x86汇编程序基础(AT&T语法)
    【转】Linux C动态内存泄漏追踪方法
    Minor【 PHP框架】6.代理
  • 原文地址:https://www.cnblogs.com/panxuejun/p/5924491.html
Copyright © 2011-2022 走看看