锁机制最大的改进之一就是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对象lockprivate 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;}@Overridepublic void run() {// 循环读取连个价格10次for(int i=0;i<10;i++){System.out.printf("%s: Price1: %f\n", Thread.currentThread().getName(), pricesInfo.getPrice1());System.out.printf("%s: Price2: %f\n", Thread.currentThread().getName(), pricesInfo.getPrice2());}}}

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

public class Writer implements Runnable {private PricesInfo pricesInfo;public Writer(PricesInfo pricesInfo){this.pricesInfo = pricesInfo;}@Overridepublic void run() {// 循环修改两个价格3次try {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.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

转载于:https://www.cnblogs.com/gaopeng527/p/4906903.html

使用读写锁实现同步数据访问相关推荐

  1. JAVA读锁不使用效果一样_Java使用读写锁替代同步锁

    应用情景 前一阵有个做反抄袭检测的小伙伴问了我一个问题. --- 在多线程里就是有个变量,我需要读取它来判断是否给它写入一些信息. 打算加锁,但是如果读取时候加入readlock,写入时候加入writ ...

  2. c/c++:线程同步(互斥锁、死锁、读写锁、条件变量、生产者和消费者模型、信号量)

    目录 1. 概念 2. 互斥锁 3. 死锁 4. 读写锁 5. 条件变量 5.1 生产者和消费者模型 6. 信号量 1. 概念 线程同步: > 当有一个线程在对内存进行操作时,其他线程都不可以对 ...

  3. OPC的数据访问方法分别有同步访问、异步访问和订阅式

    OPC的数据访问方法分别有同步访问.异步访问和订阅式数据采集方式三种. 1 同步数据访问方式 OPC服务器把按照OPC应用程序的要求得到的数据访问结果作为方法的参数返回给OPC应用程序,OPC应用程序 ...

  4. 数据库读写锁的C++实现

    一.基本概念 在数据库中,对某数据的两个基本操作为写和读,分布有两种锁控制:排它锁(X锁).共享锁(S锁). 排它锁(x锁):若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁,直至T释 ...

  5. ASP.NET2.0中数据源控件之异步数据访问

    IAsyncResult 在第 1 部分和第 2 部分中, 建立了 WeatherDataSource 控件,该控件针对 weather.com(英文)所提供的 XML API 来运行,使用 WebR ...

  6. OPC数据访问方法简介

    OPC的数据访问方法分别有"同步访问"."异步访问"和"订阅式数据采集方式"三种. 1. 同步数据访问方式 OPC服务器把按照OPC应用程序 ...

  7. 线程同步(互斥锁、条件、读写锁、信号量)

    参考:(四十三)线程--线程同步(互斥锁.读写锁.条件变量.信号量) 作者:FadeFarAway 发布时间:2017-01-17 21:25:28 网址:https://blog.csdn.net/ ...

  8. Linux系统编程----16(线程同步,互斥量 mutex,互斥锁的相关函数,死锁,读写锁)

    同步概念 所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两 个设备之间规定一个共同的时间参考:数据库同步,是指让两个或多个数据库内容 ...

  9. linux 进程间读写锁,Linux系统编程—进程间同步

    我们知道,线程间同步有多种方式,比如:信号量.互斥量.读写锁,等等.那进程间如何实现同步呢?本文介绍两种方式:互斥量和文件锁. ##互斥量mutex 我们已经知道了互斥量可以用于在线程间同步,但实际上 ...

  10. 并发编程概念、程序线程进程、线程同步、互斥量、读写锁、协程并发

    多线程: 多线程就是同时执行多个应用程序,需要硬件的支持 同时执行:不是某个时间段同时,cpu切换的比较快,所有用户会感觉是在同时运行 并发与并行: 并行(parallel):指在同一时刻,有多条指令 ...

最新文章

  1. 15篇「ICCV2021 Oral」最新论文抢先看!看当下计算机视觉在研究什么?
  2. java word表格_Java 添加Word表格行或列
  3. Oracle的SOME,ANY和ALL操作
  4. Google AutoML最新技术解析:AutoML-Zero,从0构建模型
  5. ios34---GDC,dispatch_once
  6. Sublime Text 2 中运行 PHP
  7. Web工程师修行笔记_必备单词(第三部)
  8. 如何配置一个最基本的web富文本编辑器?--之wangEditor(验证成功)
  9. 软件测试 学习之路 linux 基础命令 (三)
  10. html头部中各式各样的meta
  11. Windows新建一个新的磁盘空间:
  12. shell脚本基础 (一)
  13. open_flash_chat
  14. Log4Net Layout使用以及扩展
  15. C# 匿名对象(匿名类型)、var、动态类型 dynamic
  16. 升级tomcat遇到的坑
  17. 破解软件试用版到期问题通用办法
  18. win10系统用cadance画封装软件卡死问题
  19. trans系列是sci几区_怎么确定SCI论文期刊是几区的?
  20. win11 即将来临 —— 你真的会管理你的Windows 10吗?

热门文章

  1. 关键词提取算法TF-IDF
  2. VisualGDB系列9:配置VS直接通过SSH方式访问Linux项目
  3. kubernetes 升级到1.6
  4. 活动目录的灾难恢复操作指导之一
  5. 博文视点 疯狂ios讲义之选择器(UIPickerView)
  6. 关于全局低级键盘hook的记录(WH_KEYBOARD_LL)
  7. 【鱼眼镜头2】[鱼眼畸变模型]:评估了五个模型:radial,division,FOV,多项式(如双三次]和rational模型。
  8. C++--第0课 - 学习C++的意义
  9. 多线程编程中锁的种类与应用举例
  10. 精益质量管理之做好质量管理工作的三大管理手法