Java并发编程-09-使用读写锁同步数据访问
来源:互联网 发布:网络流行词汇及解释 编辑:程序博客网 时间:2024/06/07 02:32
一、ReadWriteLock接口
1、可以看出,这个是java1.5添加的
2、主要的实现类是ReentrantReadWriteLock
3、主要的方法是readLock()和writeLock()
二、测试代码
package com.concurrent.threadSynchronize;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;public class PricesInfo {private double prices1;private double prices2;// 定义读写锁private ReadWriteLock readWriteLock;public PricesInfo() {this.prices1 = 1.0;this.prices2 = 2.0;readWriteLock = new ReentrantReadWriteLock();}public double getPrices1() {readWriteLock.readLock().lock();double value = prices1;readWriteLock.readLock().unlock();return value;}public double getPrices2() {readWriteLock.readLock().lock();double value = prices2;readWriteLock.readLock().unlock();return value;}public void setPrices(double prices1, double prices2) {readWriteLock.writeLock().lock();this.prices1 = prices1;this.prices2 = prices2;readWriteLock.writeLock().unlock();}}package com.concurrent.threadSynchronize;public class Reader implements Runnable {private PricesInfo pricesInfo;public Reader(PricesInfo pricesInfo) {this.pricesInfo = pricesInfo;}//循环读取价格10次@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.printf("%s : Price 1 : %f\n", Thread.currentThread().getName(), pricesInfo.getPrices1());System.out.printf("%s : Price 2 : %f\n", Thread.currentThread().getName(), pricesInfo.getPrices2());}}}package com.concurrent.threadSynchronize;public class Writer implements Runnable {private PricesInfo pricesInfo;public Writer(PricesInfo pricesInfo) {this.pricesInfo = pricesInfo;}// 循环修改价格三次@Overridepublic void run() {for (int i = 0; i < 3; i++) {System.out.println("Writer : Attempt to modify the prices.");pricesInfo.setPrices(Math.random() * 10, Math.random() * 8);System.out.println("Writer : The prices has been modified.");try {Thread.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}}}}package com.concurrent.threadSynchronize;public class Main2 {public static void main(String[] args) {PricesInfo pricesInfo = new PricesInfo();Reader[] readers = new Reader[5];Thread[] threadReaders = new Thread[5];for (int i = 0; i < 5; i++) {readers[i] = new Reader(pricesInfo);threadReaders[i] = new Thread(readers[i]);}Writer writer = new Writer(pricesInfo);Thread threadWriter = new Thread(writer);// 启动这六个线程for (int i = 0; i < 5; i++) {threadReaders[i].start();}threadWriter.start();}}
结果:Thread-2 : Price 1 : 1.000000Thread-2 : Price 2 : 2.000000Thread-2 : Price 1 : 1.000000Thread-2 : Price 2 : 2.000000Thread-2 : Price 1 : 1.000000Thread-2 : Price 2 : 2.000000Thread-2 : Price 1 : 1.000000Thread-2 : Price 2 : 2.000000Thread-2 : Price 1 : 1.000000Thread-2 : Price 2 : 2.000000Thread-2 : Price 1 : 1.000000Thread-2 : Price 2 : 2.000000Thread-2 : Price 1 : 1.000000Thread-2 : Price 2 : 2.000000Thread-2 : Price 1 : 1.000000Thread-2 : Price 2 : 2.000000Thread-2 : Price 1 : 1.000000Thread-2 : Price 2 : 2.000000Thread-2 : Price 1 : 1.000000Thread-2 : Price 2 : 2.000000Thread-3 : Price 1 : 1.000000Thread-3 : Price 2 : 2.000000Thread-3 : Price 1 : 1.000000Thread-3 : Price 2 : 2.000000Thread-3 : Price 1 : 1.000000Thread-3 : Price 2 : 2.000000Thread-3 : Price 1 : 1.000000Thread-3 : Price 2 : 2.000000Thread-3 : Price 1 : 1.000000Thread-3 : Price 2 : 2.000000Thread-3 : Price 1 : 1.000000Thread-3 : Price 2 : 2.000000Thread-3 : Price 1 : 1.000000Thread-3 : Price 2 : 2.000000Thread-3 : Price 1 : 1.000000Thread-3 : Price 2 : 2.000000Thread-3 : Price 1 : 1.000000Thread-3 : Price 2 : 2.000000Thread-3 : Price 1 : 1.000000Thread-3 : Price 2 : 2.000000Writer : Attempt to modify the prices.Thread-4 : Price 1 : 1.000000Thread-4 : Price 2 : 2.000000Thread-4 : Price 1 : 3.783085Thread-4 : Price 2 : 6.706074Thread-4 : Price 1 : 3.783085Thread-4 : Price 2 : 6.706074Thread-4 : Price 1 : 3.783085Thread-0 : Price 1 : 1.000000Thread-0 : Price 2 : 6.706074Thread-0 : Price 1 : 3.783085Thread-0 : Price 2 : 6.706074Thread-0 : Price 1 : 3.783085Thread-0 : Price 2 : 6.706074Thread-0 : Price 1 : 3.783085Thread-0 : Price 2 : 6.706074Thread-0 : Price 1 : 3.783085Thread-0 : Price 2 : 6.706074Thread-1 : Price 1 : 1.000000Thread-0 : Price 1 : 3.783085Thread-4 : Price 2 : 6.706074Thread-4 : Price 1 : 3.783085Writer : The prices has been modified.Thread-4 : Price 2 : 6.706074Thread-4 : Price 1 : 3.783085Thread-4 : Price 2 : 6.706074Thread-4 : Price 1 : 3.783085Thread-4 : Price 2 : 6.706074Thread-4 : Price 1 : 3.783085Thread-4 : Price 2 : 6.706074Thread-4 : Price 1 : 3.783085Thread-4 : Price 2 : 6.706074Thread-4 : Price 1 : 3.783085Thread-4 : Price 2 : 6.706074Thread-0 : Price 2 : 6.706074Thread-0 : Price 1 : 3.783085Thread-0 : Price 2 : 6.706074Thread-0 : Price 1 : 3.783085Thread-0 : Price 2 : 6.706074Thread-0 : Price 1 : 3.783085Thread-0 : Price 2 : 6.706074Thread-0 : Price 1 : 3.783085Thread-0 : Price 2 : 6.706074Thread-1 : Price 2 : 6.706074Thread-1 : Price 1 : 3.783085Thread-1 : Price 2 : 6.706074Thread-1 : Price 1 : 3.783085Thread-1 : Price 2 : 6.706074Thread-1 : Price 1 : 3.783085Thread-1 : Price 2 : 6.706074Thread-1 : Price 1 : 3.783085Thread-1 : Price 2 : 6.706074Thread-1 : Price 1 : 3.783085Thread-1 : Price 2 : 6.706074Thread-1 : Price 1 : 3.783085Writer : Attempt to modify the prices.Thread-1 : Price 2 : 6.706074Writer : The prices has been modified.Thread-1 : Price 1 : 9.636421Thread-1 : Price 2 : 0.480659Thread-1 : Price 1 : 9.636421Thread-1 : Price 2 : 0.480659Thread-1 : Price 1 : 9.636421Thread-1 : Price 2 : 0.480659Writer : Attempt to modify the prices.Writer : The prices has been modified.
0 0
- Java并发编程-09-使用读写锁同步数据访问
- 并发编程--使用读写锁实现同步数据访问
- java并发编程实战手册第二章使用读写锁实现同步数据访问
- Java并发学习之十五——使用读写锁同步数据访问
- java并发编程系列之ReadWriteLock读写锁的使用
- Java并发编程-08-使用锁实现同步
- Java 并发编程(五)同步锁Lock的使用
- 【JAVA 并发】一 同步访问共享的可变数据
- java并发编程——读写锁
- Java并发编程之读写锁
- java并发编程之读写锁
- Java并发编程之读写锁
- Java并发编程之读写锁
- java多线程-使用ReadWriteLock同步数据访问
- 并发编程--使用锁实现同步
- java并发编程之线程同步基础(二)使用锁实现同步
- 【Java并发编程】内在锁和同步
- 并发-同步访问共享的可变数据
- 2015061504 - 代码分析之代码格式(1)
- 算法
- Linux 为知笔记 创建快捷方式
- Handler,Looper,MessageQueue的工作原理
- 2833x的中断
- Java并发编程-09-使用读写锁同步数据访问
- Android中Broadcast Receiver组件详解
- nodejs express route 的用法
- 一些ios视频处理的资源 备下来后期关注
- 设计模式大杂烩
- 爬虫框架Scrapy的第一个爬虫示例入门教程
- 二叉查找树(2) - 删除节点
- java中的深复制和浅复制
- HTTP报文格式说明