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;}@Overridepublic 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构造的锁,会造成读与读之间的互斥, ...
随机推荐
- 【POJ】1286.Necklace of Beads
题解 群论,我们只要找出所有的置换群的所有循环节 具体可参照算法艺术与信息学竞赛 旋转的置换有n个,每一个的循环节个数是gcd(N,i),i的范围是0到N - 1 翻转,对于奇数来说固定一个点,然后剩 ...
- PHP学习日记 函数
可变函数 PHP支持可变函数的概念.所以如果一个变量后面有圆括号“()”,PHP将寻找与变量值同名的函数,并尝试执行此函数,可变函数可以用来实现回调函数.函数列表等.可变函数不能用于echo.prin ...
- printf的定义
1. printf的宏定义 #define XXX_ERROR 0#define XXX_WARNING 1#define XXX_INFO 2#define XXX_DEBUG 3#define X ...
- vue开发computed,watch,method执行的先后顺序
1#computed:计算属性将被混入到 Vue 实例中.所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例. 2#methods:methods 将被混入到 Vue ...
- 使用DNSPod域名解析
1 在GoDaddy域名注册商 注册域名 https://sg.godaddy.com/zh/ 2 登陆DNSPod https://www.dnspod.cn 3 选择域名解析 添加域名 4 添加记 ...
- [leetcode sort]57. Insert Interval
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...
- type="submit"表单提交理解
1.默认为form提交表单 . button则响应用户自定义的事件,如果不指定onclick等事件处理函数,它是不做任何事情.当然,button也可以完成表单提交的工作. 2.method=" ...
- BZOJ 3572: [Hnoi2014]世界树 虚树 树形dp
https://www.lydsy.com/JudgeOnline/problem.php?id=3572 http://hzwer.com/6804.html 写的时候参考了hzwer的代码,不会写 ...
- 【原创】实战padding oracle漏洞
首先关于padding oracle漏洞的原理请看: 步入正传~~ 搭建漏洞利用环境Perl 环境下载地址:链接:http://pan.baidu.com/s/1skFxVm1 密码:anuw 首先查 ...
- C语言学习常见错误分析
错误分类 语法错 逻辑错 运行错 0.忘记定义变量: int main() { x=3;y=6; printf("%d/n",x+y); } 1.C语言的变量一定要先定义 ...