ReentrantReadWriteLock锁例子
锁所提供的最重要的改进之一就是ReadWriteLock接口和唯一 一个实现它的ReentrantReadWriteLock类。这个类提供两把锁,一把用于读操作和一把用于写操作。同时可以有多个线程执行读操作,但只有一个线程可以执行写操作。当一个线程正在执行一个写操作,不可能有任何线程执行读操作。
参考http://ifeve.com/basic-thread-synchronization-6/#more-7030 做了优化的例子
创建了5个读线程、一个写线程,分别读10次、写3次
PricesInfo
package threadTest.reentrantReadWriteLockTest; 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() {
this.price1 = 1.0;
this.price2 = 2.0;
this.lock = new ReentrantReadWriteLock();
} public double getPrice1() {
lock.readLock().lock();
System.out.printf("%s : Price1 开始读了!\n" ,Thread.currentThread().getName());
double value = price1;
System.out.printf("%s : Price1 读取完毕 : %f\n"
,Thread.currentThread().getName(),value);
lock.readLock().unlock();
return value;
} public double getPrice2() {
lock.readLock().lock();
System.out.printf("%s : Price2开始读了!\n" ,Thread.currentThread().getName());
double value = price2;
System.out.printf("%s : Price2读取完毕 : %f\n"
,Thread.currentThread().getName(),value);
lock.readLock().unlock();
return value;
} public void setPrices(double price1, double price2) {
lock.writeLock().lock();
System.out.printf("Writer:Attempt to modify the price.\n");
this.price2 = price2;
this.price1 = price1; System.out.printf("Writer:Prices have been modified.\n");
lock.writeLock().unlock(); } }
Reader
package threadTest.reentrantReadWriteLockTest; public class Reader implements Runnable {
private PricesInfo priceInfo; public Reader(PricesInfo priceInfo) {
this.priceInfo = priceInfo;
} @Override
public void run() {
for (int i = 0; i < 10; i++) {
priceInfo.getPrice1();
priceInfo.getPrice2();
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Writer
package threadTest.reentrantReadWriteLockTest; 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++) {
pricesInfo.setPrices((i+1)* 10, (i+1) * 100);
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
main函数
package threadTest.reentrantReadWriteLockTest; public class App1 {
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();
}
}
结果如下
使用ReentrantReadWriteLock,同时可以有多个线程执行读操作,但只有一个线程可以执行写操作
ReentrantReadWriteLock锁例子的更多相关文章
- 缓存中使用的ReentrantReadWriteLock锁
java中提供了lock锁,简便了设计缓存,下面程序主要是使用读写锁的应用.... import java.util.HashMap; import java.util.Map; import jav ...
- Java多线程可重入锁例子解析
“可重入锁”的概念是:自己可以再次获得自己的内部锁.比如有一条线程获得了某个对象的锁,此时这个对象还没有释放,当其再次想获得这个对象的锁的时候还是可以获得的,如果不可锁重入的话,就会造成死锁. cla ...
- java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock
原文:java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock 锁 锁是用来控制多个线程访问共享资源的方式,java中可以使用synch ...
- java锁类型
转载链接在每个锁类型后边 线程锁类型 1.自旋锁 ,自旋,jvm默认是10次吧,有jvm自己控制.for去争取锁 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchroni ...
- 05 JDK1.5 Lock锁
一.synchronized的再次讨论 使用synchronized关键字来标记一个方法或者代码块,当某个线程调用该对象的synchronized方法或者访问synchronized代码块时, 这个线 ...
- Java并发--lock锁详解
在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方 ...
- Java并发处理锁 Lock
在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在 java.util.concurrent.locks 包下提供了另外一 ...
- 搞定ReentrantReadWriteLock 几道小小数学题就够了
| 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it ...
- 史上最全java里面的锁
什么是锁 在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制.锁旨在强制实施互斥排他.并发控制策略. 锁通常需要硬件支持才能有效实施.这 ...
随机推荐
- docker login harbor出现的报错Error response from daemon: Get https://172.16.1.99/v1/users/: dial tcp 172.16.1.99:443: getsockopt: connection refused解决方法
出现的问题 [root@master01 ~]# docker login 172.16.1.99 Username: admin Password: Error response from daem ...
- 给你出道题:依次去掉离中心最远的M个点
给定一个数组a[N],里面包含N个向量.现在要求进行删点操作,删点原则如下: 1.求出N个向量的中心O1,删除离O1最远的那个点 2.求出N-1个向量的中心O2,删除O2最远的那个点 ...... 重 ...
- Google Map 学习过程中的代码
<!DOCTYPE html><html> <head> <title>Simple click event</title> <met ...
- OGG_GoldenGate数据传递文件Trial(案例)
2014-03-05 Created By BaoXinjian
- Python find() 方法
描述 Python find() 方法从字符串中找出某个子字符串第一个匹配项的索引位置,该方法与index() 方法一样,只不过如果子字符串不在字符串中不会报异常,而是返回-1. 语法 find() ...
- php json的相关操作
类与json <?php class userinfo { var $user_name; var $user_ip; var $user_logintime; } $u = new useri ...
- es6编写generator报错
首先babel基础包(不安装额外东西)并不是支持完整的es6语言 自己写的如下代码 let generator = function* () { ; ,,]; ; }; var gen = gener ...
- Linode中的Network Helper
Linode主机vps有一个很好的网络配置工具:Network Helper,他可以在系统启动的时候,根据你的操作系统,以及检测到的网络配置等信息,自动配置好网络,非常有用. 官方文档: Networ ...
- angular学习笔记(十)-src和href处理
本篇主要介绍angular中图片的src和链接的href的处理: 用到了以下两个属性: ng-src: 绑定了数据的路径表达式 ng-href: 绑定了数据的路径表达式 例如: <!DOCTYP ...
- 转-webstorm快捷键
默认配置-Eclipse的常用快捷键对照表 查找/代替 Webstorm快捷键 Eclipse快捷键 说明 ctrl+shift+N ctrl+shift+R 通过文件名快速查找工程内的文件(必记) ...