23.读写锁ReadWriteLock
ReentrantReadWriteLock
所谓的读写锁,是访问资源共享共享锁、互斥锁,如果对资源加了写锁,其他线程无法获取写锁与读锁,但是持有写锁的线程,可以对资源
加读锁;如果一个线程对资源加了读锁,那么其他线程可以继续加读锁。读读共享、读写互斥、写写互斥
package dmeo9;
public class MyAccount {
private String oid;
private int cash;
public MyAccount(){
}
public MyAccount(String oid, int cash) {
this.oid = oid;
this.cash = cash;
}
public String getOid() {
return oid;
}
public void setOid(String oid) {
this.oid = oid;
}
public int getCash() {
return cash;
}
public void setCash(int cash) {
this.cash = cash;
}
}
package dmeo9;
import java.util.concurrent.locks.ReadWriteLock;
public class User implements Runnable {
private String name;//用户名
private MyAccount myAccount;//操作的账户
private int ioCash;//操作的金额
private ReadWriteLock readWriteLock;//读写锁操作锁需要的锁
private boolean isCheck;//是否操作?
public User() {
}
public User(String name, MyAccount myAccount, int ioCash, ReadWriteLock readWriteLock, boolean isCheck) {
this.name = name;
this.myAccount = myAccount;
this.ioCash = ioCash;
this.readWriteLock = readWriteLock;
this.isCheck = isCheck;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public MyAccount getMyAccount() {
return myAccount;
}
public void setMyAccount(MyAccount myAccount) {
this.myAccount = myAccount;
}
public int getIoCash() {
return ioCash;
}
public void setIoCash(int ioCash) {
this.ioCash = ioCash;
}
public ReadWriteLock getReadWriteLock() {
return readWriteLock;
}
public void setReadWriteLock(ReadWriteLock readWriteLock) {
this.readWriteLock = readWriteLock;
}
public boolean isCheck() {
return isCheck;
}
public void setCheck(boolean check) {
isCheck = check;
}
@Override
public void run() {
if (isCheck) {
/*获取读锁*/
try {
readWriteLock.readLock().lock();
System.err.println("\n读:" + getName() + "\t正在read 查询\t" + getMyAccount() + "\t账户,当前金额为:" + myAccount.getCash());
} catch (Exception e) {
e.printStackTrace();
} finally {
/*释放读锁*/
readWriteLock.readLock().unlock();
}
} else {
/*获取写的锁*/
try {
readWriteLock.writeLock().lock();
System.err.println("写:" + getName() + "\t正在write 操作\t" + getMyAccount() + "账户,当前金额为:" + myAccount.getCash());
getMyAccount().setCash(getMyAccount().getCash() + getIoCash());
System.err.println("操作成功:金额为" + getIoCash() + "\t当前金额为:" + getMyAccount().getCash()+"\n\n");
} catch (Exception e) {
e.printStackTrace();
} finally {
/*释放写锁*/
/**
* 一般用lock或者 readwritelock时,需要把
unlock方法放在一个 fianlly 块中,因为程序运行的时候可能会
出现一些我们人为控制不了的因素,导致锁一直没释放,那其他线程就进不来了.
*/
readWriteLock.writeLock().unlock();
}
}
}
}
package dmeo9;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class DemoReadWriteLock {
public static void main(String[] args){
MyAccount myAccount = new MyAccount("工商银行95599200901215522",160000);
ReadWriteLock readWriteLock = new ReentrantReadWriteLock(false);
ExecutorService executorService = Executors.newFixedThreadPool(2);
User u1 = new User("张三", myAccount, -4000, readWriteLock, false);
User u2 = new User("小明", myAccount, 6000, readWriteLock, false);
User u3 = new User("小明", myAccount, -8000, readWriteLock, false);
User u4 = new User("小明", myAccount, 800, readWriteLock, false);
User u5 = new User("小明他爹", myAccount, 0, readWriteLock, true);
executorService.execute(u1);
executorService.execute(u2);
executorService.execute(u3);
executorService.execute(u4);
executorService.execute(u5);
/*关闭线程池*/
executorService.shutdown();
}
}
输出:
写:张三 正在write 操作 dmeo9.MyAccount@1a8fdcaa账户,当前金额为:160000
操作成功:金额为-4000 当前金额为:156000 写:小明 正在write 操作 dmeo9.MyAccount@1a8fdcaa账户,当前金额为:156000
操作成功:金额为6000 当前金额为:162000 写:小明 正在write 操作 dmeo9.MyAccount@1a8fdcaa账户,当前金额为:162000
操作成功:金额为-8000 当前金额为:154000 写:小明 正在write 操作 dmeo9.MyAccount@1a8fdcaa账户,当前金额为:154000
操作成功:金额为800 当前金额为:154800 读:小明他爹 正在read 查询 dmeo9.MyAccount@1a8fdcaa 账户,当前金额为:154800
23.读写锁ReadWriteLock的更多相关文章
- 线程中的读写锁ReadWriteLock
Lock锁还有两个非常强大的类 ReadWriteLock接口实现类ReentrantReadWriteLock(非常重要的锁) 想实现 读取的时候允许多线程并发访问,写入的时候不允许. 这种效果.. ...
- 显式锁(三)读写锁ReadWriteLock
前言: 上一篇文章,已经很详细地介绍了 显式锁Lock 以及 其常用的实现方式- - ReetrantLock(重入锁),本文将介绍另一种显式锁 - - 读写锁ReadWriteLock. ...
- 【漫画】互斥锁ReentrantLock不好用?试试读写锁ReadWriteLock
ReentrantLock完美实现了互斥,完美解决了并发问题.但是却意外发现它对于读多写少的场景效率实在不行.此时ReentrantReadWriteLock来救场了!一种适用于读多写少场景的锁,可以 ...
- 【漫画】读写锁ReadWriteLock还是不够快?再试试StampedLock!
本文来源于公众号[胖滚猪学编程] 转载请注明出处! 在互斥锁ReentrantLock不好用?试试读写锁ReadWriteLock一文中,我们对比了互斥锁ReentrantLock和读写锁ReadWr ...
- 读-写锁 ReadWriteLock & 线程八锁
读-写锁 ReadWriteLock: ①ReadWriteLock 维护了一对相关的锁,一个用于只读操作, 另一个用于写入操作. 只要没有 writer,读取锁可以由 多个 reader 线程同时保 ...
- C# 多线程编程之锁的使用【互斥锁(lock)和读写锁(ReadWriteLock)】
多线程编程之锁的使用[互斥锁(lock)和读写锁(ReadWriteLock)] http://blog.csdn.net/sqqyq/article/details/18651335 多线程程序写日 ...
- Java 读写锁 ReadWriteLock 原理与应用场景详解
Java并发编程提供了读写锁,主要用于读多写少的场景,今天我就重点来讲解读写锁的底层实现原理@mikechen 什么是读写锁? 读写锁并不是JAVA所特有的读写锁(Readers-Writer Loc ...
- 深入理解读写锁—ReadWriteLock源码分析
转载:https://blog.csdn.net/qq_19431333/article/details/70568478 ReadWriteLock管理一组锁,一个是只读的锁,一个是写锁.读锁可以在 ...
- 读写锁ReadWriteLock和缓存实例
读写锁:多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥.即:读的时候不允许写,写的时候不允许读,可以同时读. synchronized关键字和普通的Lock构造的锁,会造成读与读之间的互斥, ...
随机推荐
- 【LOJ】#2320. 「清华集训 2017」生成树计数
题解 我,理解题解,用了一天 我,卡常数,又用了一天 到了最后,我才发现,我有个加法取模,写的是while(c >= MOD) c -= MOD 我把while改成if,时间,少了 六倍. 六倍 ...
- CSU - 2058 跳一跳
Description 冰弦非常热衷于过气微信小游戏"跳一跳",现在给出了他每次游戏时的一些信息,请你帮他计算一下每局游戏的得分. 跳一跳的游戏规则如下: 玩家操控一个小棋子,在形 ...
- 在chrome开发者工具中观察函数调用栈、作用域链、闭包
在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量对象,闭包,this等关键信息的变化.因此,断点调试对于快 ...
- python开发_thread_布朗运动
这篇blog是非常有趣的,是的,他非常有趣 下面我将给大家介绍有关python中thread来实现布朗运动的一个例子 下面是运行效果: ================================ ...
- Codeforces Round #295 (Div. 2)C - DNA Alignment 数学题
C. DNA Alignment time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- Git_标签管理
发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来.所以,标签也是版本库的一个快照. Git ...
- 【Deep Learning】一、AutoEncoder
Deep Learning 第一战: 完成:UFLDL教程 稀疏自编码器-Exercise:Sparse Autoencoder Code: 学习到的稀疏参数W1: 参考资料: UFLDL教程 稀疏自 ...
- php输出mysqli查询出来的结果
php连接mysql我有文章已经写过了,这篇文章主要是介绍从mysql中查询出结果之后怎么输出的问题. 一:mysqli_fetch_row(); 查询结果:array([0]=>小王) 查询: ...
- How to Find Processlist Thread id in gdb !!!!!GDB 使用
https://mysqlentomologist.blogspot.jp/2017/07/ Saturday, July 29, 2017 How to Find Process ...
- HDU 2604 Queuing 矩阵高速幂
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...