『凯哥Java』Java多线程并发之读写锁( 二 )
文章图片
从运行结果中 , 我们可以发现当工号未13的还没有更新完车次信息的时候 , 工号12和14的员工也来更新了 。 这种操作是不允许的 。 因为写操作要原子性 , 要独占 。 当工作人员甲在修改的时候车次信息的时候 , 其他工作人员不能同时修改同一个车次信息了 。 而且从乘客获取车次信息的数据来看 , 获取到的只是工号是13的 。 这个时候获取到的数据不一定是正确的了 。 所以 , 不使用锁是不行的 。
使用排他锁
如果使用独占式做的话 , 我们查看运行结果:

文章图片
从运行结果来看 , 再读取的时候 , 需要一个一个读取的 。 当16号乘客查看的时候 , 17号乘客是不能查看的 。 这个是不符合实际业务逻辑的 。 所以 , 独占式(排他锁)RLock在这里不适合 。 我们再来看看读写锁:
使用读写锁
先来看看使用读写锁的屏幕对象

文章图片
再来看看运行结果:

文章图片
【『凯哥Java』Java多线程并发之读写锁】从运行结果中 , 我们可以看到 , 工作人员是一个一个的操作完成的 。 当14号操作完成之后 , 13号和12号才可以操作的 。 这个符号我们正常的业务 。 乘客读取的时候 , 读取到的都是最后一次更新 , 这个也符合我们的业务 。 所以 , 通过读写锁来操作车站屏幕是可以的 。

文章图片
四:读写锁总结
4.1:wrLock类对象

文章图片
同样包含了公平锁和非公平锁 。
其中ReadLock是读锁对象;WriteLock是写锁对象 。
4.2:使用语法
读操作使用ReadLock

文章图片
编辑
写操作的时候 , 使用WriteLock对象:

文章图片
4.3:总结
读写锁(ReentrantReadWriteLock),凯哥就简写rwLock 。 也可以实现公平和非公平的 。 其内部维护了一对锁:一个读锁(ReadLock对象) , 一个写锁(writeLock对象) , 通过读写分离的方式来提高并发性能 。 读写锁也叫共享锁 。 其共享是在读数据的时候 , 可以让多个线程同时进行读操作的 。 在写的时候具有排他性 , 其他读或者写操作都要被阻塞 。
一般情况下 , 读写锁的性能都会比排他锁性能好 , 那是因为 , 大多数场景读操作多于写操作的 。 在读多与写的场景下 , 读写锁能够提供比排他锁更好的并性能和吞吐量 。
推荐阅读
- 『Java』java数据结构系列——什么是数据结构
- 『Java』马云:成功人跟普通人差不多,但这三点我一定要分享给所有年轻人
- #Java#java线程到底有多少种状态?
- #智能手表#1、初识java-1
- [华为]有朋友问我“JAVA全栈”、“互联网架构师”和“JAVAEE”到底是什么?
- 「javascript」这边走Javascript了解一下
- 「华为」一篇有趣的Java class
- struts@Java面试之项目面试问题——不看面试会后悔的
- IT之家R9 3900,12核心24线程,吾空空妖X5笔记本发布:搭载AMD
- 「Java」六面蚂蚁金服,唬住了面试官要了30K;其实Java面试也没那么难
