沧州小区:从火车站车次公示栏来学Java读写锁

admin 2个月前 (04-07) 科技 4 0

Java多线程并发之读写锁

本文主要内容:读写锁的理论;通过生涯中例子来明白读写锁;读写锁的代码演示;读写锁总结。通过理论(总结)-例子-代码-然后再次总结,这四个步骤来让人人对读写锁的深刻明白。

本篇是《凯哥(凯哥Java:kagejava)并发编程学习》系列之《Lock系列》教程的第七篇:《Java并发包下锁学习第七篇:读写锁》。

一:读写锁的理论

什么是读写锁?

多个线程同时读一个资源类是没有任何问题的,以是为了知足在并发的情况下,读取共享资源应该是可以同时举行的;然则,若是一个线程想要去写共享资源,就不应该再有其他线程可以对该共享资源举行读或者是写操作了。

即读写锁在统一时刻可以允许多个多线程接见,然则在写线程接见的时刻,所有的读线程和其他写线程都会被壅闭。读写锁现实维护了一对锁,一个读锁,一个写锁,通过星散读锁和写锁,使得其并发性比独占式锁(排他锁)有了很大的提升。

为什么需要读写锁?

通过前面文章的学习,我们知道了ReentrantLock(下文简称:RLock)工具了。Rlock比起synchronized(下文简称Sync)来说有三个优点:RLock可以被中止;RLock可以有公正锁;RLock可以绑定多个条件。那么既然RLock比Sync有这么多优点,为什么还需要读写锁呢?

那是由于RLock是独占式(排他) 锁,即当线程1获取到资源的时刻,其他线程不能再来操作共享资源了。就算是RLock的操作是读取的时刻,其他线程也不能读取共享资源的操作。这在现实生涯中是不相符逻辑的(在下文神话中读写锁的例子中我们就能体会到为什么不相符逻辑的),而且性能也比较慢。以是就有了读写锁的泛起。

二:读写锁的明白

生涯中读写锁的例子

例子一:我们人人去火车站搭车的时刻,有个大大的公示屏幕,会告诉人人当前车次是否晚点。显示屏是给给所有搭客看的,若是火车晚点,对应车次后面就会被修改成晚点约莫xxx分钟。这个修改的动作只能是火车站内部人员来操作的,我们搭客是不能操作的。这个历程,站在并发角度来剖析的的话:电子屏幕是共享数据;千千万万的搭客是差别的线程;火车站内部工作人员也是差别的线程;搭客是读资源的线程,当一个线程来读取的时刻,其他线程也可以读取操作的;火车站内部工作人员修改火车信息的时刻,同时只能有一个工作人员来修改,不能两个都来修改。若是两个都来修改的话,上一秒显示晚点1min,下一秒显示正常。这个是不行的,搭客有可能会错过搭车的。以是修改的时刻同时只能由一个工作人员来修改。

例子二:我们在玩王者荣耀的时刻,有时刻会遇到停服更新的。在不更新前,所有玩家都可以玩,当停服更新的时刻,所有玩家就不能玩了。这个操作在并发角度来说:千千万万的玩家是读共享资源的;游戏维护者是写操作的。当停服更新的时刻,读操作就被壅闭了,只能等写操作,也就是更新完成后,才可以接着玩。

通过上面两个例子我们可以剖析到读写锁的三个参与者:共享资源;读工具;写工具。而且读和写一样平常是星散的。

三:读写锁的代码演示

我们就用火车站进站案例来模拟:

 

未使用锁的时刻

先来看看屏幕工具:

 

再来看看多个工作人员更新操作及多个搭客获取操作:

 

查看运行效果:

进入申博Sunbet官网  第1张

 

从运行效果中,我们可以发现当工号未13的还没有更新完车次信息的时刻,工号12和14的员工也来更新了。这种操作是不允许的。由于写操作要原子性,要独占。当工作人员甲在修改的时刻车次信息的时刻,其他工作人员不能同时修改统一个车次信息了。而且从搭客获取车次信息的数据来看,获取到的只是工号是13的。这个时刻获取到的数据纷歧定是准确的了。以是,不使用锁是不行的。

使用排他锁

若是使用独占式做的话,我们查看运行效果:

进入申博Sunbet官网  第2张

 

LFU五种实现方式,从简单到复杂

从运行效果来看,再读取的时刻,需要一个一个读取的。当16号搭客查看的时刻,17号搭客是不能查看的。这个是不相符现实营业逻辑的。以是,独占式(排他锁)RLock在这里不适合。我们再来看看读写锁:

使用读写锁

先来看看使用读写锁的屏幕工具

进入申博Sunbet官网  第3张

 

再来看看运行效果:

进入申博Sunbet官网  第4张

 

从运行效果中,我们可以看到,工作人员是一个一个的操作完成的。当14号操作完成之后,13号和12号才可以操作的。这个符号我们正常的营业。搭客读取的时刻,读取到的都是最后一次更新,这个也相符我们的营业。以是,通过读写锁来操作车站屏幕是可以的。

进入申博Sunbet官网  第5张

 

四:读写锁总结

4.1:wrLock类工具

进入申博Sunbet官网  第6张

 

同样包含了公正锁和非公正锁。

其中ReadLock是读锁工具;WriteLock是写锁工具。

4.2:使用语法

读操作使用ReadLock

进入申博Sunbet官网  第7张

编辑

写操作的时刻,使用WriteLock工具:

进入申博Sunbet官网  第8张

 

4.3:总结

读写锁(ReentrantReadWriteLock),凯哥就简写rwLock。也可以实现公正和非公正的。其内部维护了一对锁:一个读锁(ReadLock工具),一个写锁(writeLock工具),通过读写星散的方式来提高并发性能。读写锁也叫共享锁。其共享是在读数据的时刻,可以让多个线程同时举行读操作的。在写的时刻具有排他性,其他读或者写操作都要被壅闭。

一样平常情况下,读写锁的性能都会比排他锁性能好,那是由于,大多数场景读操作多于写操作的。在读多与写的场景下,读写锁能够提供比排他锁更好的并性能和吞吐量。

进入申博Sunbet官网  第9张

    ​    ​    ​    ​    ​    ​    ​    ​    ​    ​    ​    ​    ​    ​    ​欢迎来聊~

 

,

Sunbet

www.Lfstncnynmzyhzs.com信誉来源于每一位客户的口碑,Sunbet的服务在sunbet行业是出名的顶尖,广西禄福生态农业开发有限责任公司欢迎新老会员、代理的加入。

申博声明:该文看法仅代表作者自己,与本平台无关。转载请注明:沧州小区:从火车站车次公示栏来学Java读写锁

网友评论

  • (*)

最新评论

站点信息

  • 文章总数:927
  • 页面总数:0
  • 分类总数:8
  • 标签总数:2136
  • 评论总数:58
  • 浏览总数:6655