使用读写锁实现同步数据访问
锁机制最大的改进之一就是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
使用读写锁实现同步数据访问相关推荐
- JAVA读锁不使用效果一样_Java使用读写锁替代同步锁
应用情景 前一阵有个做反抄袭检测的小伙伴问了我一个问题. --- 在多线程里就是有个变量,我需要读取它来判断是否给它写入一些信息. 打算加锁,但是如果读取时候加入readlock,写入时候加入writ ...
- c/c++:线程同步(互斥锁、死锁、读写锁、条件变量、生产者和消费者模型、信号量)
目录 1. 概念 2. 互斥锁 3. 死锁 4. 读写锁 5. 条件变量 5.1 生产者和消费者模型 6. 信号量 1. 概念 线程同步: > 当有一个线程在对内存进行操作时,其他线程都不可以对 ...
- OPC的数据访问方法分别有同步访问、异步访问和订阅式
OPC的数据访问方法分别有同步访问.异步访问和订阅式数据采集方式三种. 1 同步数据访问方式 OPC服务器把按照OPC应用程序的要求得到的数据访问结果作为方法的参数返回给OPC应用程序,OPC应用程序 ...
- 数据库读写锁的C++实现
一.基本概念 在数据库中,对某数据的两个基本操作为写和读,分布有两种锁控制:排它锁(X锁).共享锁(S锁). 排它锁(x锁):若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁,直至T释 ...
- ASP.NET2.0中数据源控件之异步数据访问
IAsyncResult 在第 1 部分和第 2 部分中, 建立了 WeatherDataSource 控件,该控件针对 weather.com(英文)所提供的 XML API 来运行,使用 WebR ...
- OPC数据访问方法简介
OPC的数据访问方法分别有"同步访问"."异步访问"和"订阅式数据采集方式"三种. 1. 同步数据访问方式 OPC服务器把按照OPC应用程序 ...
- 线程同步(互斥锁、条件、读写锁、信号量)
参考:(四十三)线程--线程同步(互斥锁.读写锁.条件变量.信号量) 作者:FadeFarAway 发布时间:2017-01-17 21:25:28 网址:https://blog.csdn.net/ ...
- Linux系统编程----16(线程同步,互斥量 mutex,互斥锁的相关函数,死锁,读写锁)
同步概念 所谓同步,即同时起步,协调一致.不同的对象,对"同步"的理解方式略有不同.如,设备同步,是指在两 个设备之间规定一个共同的时间参考:数据库同步,是指让两个或多个数据库内容 ...
- linux 进程间读写锁,Linux系统编程—进程间同步
我们知道,线程间同步有多种方式,比如:信号量.互斥量.读写锁,等等.那进程间如何实现同步呢?本文介绍两种方式:互斥量和文件锁. ##互斥量mutex 我们已经知道了互斥量可以用于在线程间同步,但实际上 ...
- 并发编程概念、程序线程进程、线程同步、互斥量、读写锁、协程并发
多线程: 多线程就是同时执行多个应用程序,需要硬件的支持 同时执行:不是某个时间段同时,cpu切换的比较快,所有用户会感觉是在同时运行 并发与并行: 并行(parallel):指在同一时刻,有多条指令 ...
最新文章
- 15篇「ICCV2021 Oral」最新论文抢先看!看当下计算机视觉在研究什么?
- java word表格_Java 添加Word表格行或列
- Oracle的SOME,ANY和ALL操作
- Google AutoML最新技术解析:AutoML-Zero,从0构建模型
- ios34---GDC,dispatch_once
- Sublime Text 2 中运行 PHP
- Web工程师修行笔记_必备单词(第三部)
- 如何配置一个最基本的web富文本编辑器?--之wangEditor(验证成功)
- 软件测试 学习之路 linux 基础命令 (三)
- html头部中各式各样的meta
- Windows新建一个新的磁盘空间:
- shell脚本基础 (一)
- open_flash_chat
- Log4Net Layout使用以及扩展
- C# 匿名对象(匿名类型)、var、动态类型 dynamic
- 升级tomcat遇到的坑
- 破解软件试用版到期问题通用办法
- win10系统用cadance画封装软件卡死问题
- trans系列是sci几区_怎么确定SCI论文期刊是几区的?
- win11 即将来临 —— 你真的会管理你的Windows 10吗?
热门文章
- 关键词提取算法TF-IDF
- VisualGDB系列9:配置VS直接通过SSH方式访问Linux项目
- kubernetes 升级到1.6
- 活动目录的灾难恢复操作指导之一
- 博文视点 疯狂ios讲义之选择器(UIPickerView)
- 关于全局低级键盘hook的记录(WH_KEYBOARD_LL)
- 【鱼眼镜头2】[鱼眼畸变模型]:评估了五个模型:radial,division,FOV,多项式(如双三次]和rational模型。
- C++--第0课 - 学习C++的意义
- 多线程编程中锁的种类与应用举例
- 精益质量管理之做好质量管理工作的三大管理手法