00:00
各位同学大家好,我们继续接下来回答这个题目,请你简单聊聊可重入的读写所。然后落地到我们这些锁的演变,好一步步推,怎么来的,好端端的,为什么要学习这么一个锁,那么大家呢,都清楚啊。来我们呢,就。玉葫芦画瓢吧。这个。这个然后呢。这个啊。那么来,同学们。我们大家呢,都清楚,就这么来一个啊,这个是一。这个是二。这个是三。这是四好,那么我们一开始啊。只要是个Java程序,我们先回顾啊,第一种无锁没人管。那么。这种情况下,就比如说我们的卖票,那绝对是什么天下大乱对吧,各种。
01:01
错乱的数据,那么同学们这个呢,是大家经历过也明白我们这说的是什么意思,对不对,那么所以说呢,我们呢,不能够有这种混乱。不讲了,只要是高并发多线程,100%要加锁无锁的情况不废话,那么下面我们来到第二种,第二种好说,最经典的我们大家都知道。SYNCH对吧,然后我们的洛接口。下面最经典的一个实现类是不是可重入锁,弟兄们,这个我相信大家没有任何问题,对吧,那么好。能不能控制住无所中状态,那么是不是从无序慢慢的过渡到了有序了?这个我相信大家没有任何问题对吧,而且是什么数据。一致性,OK,因为每一次啊。
02:01
有且仅有一个线程。来反问,不管你是什么操作对不对,所以说呢,这种情况下它是非常好的,对于我们的数据的一致性,那啥意思呢,这个时候我们呢,就会明白啊,就像是呃。一个串行化。这个冰糖葫芦串。你吃完是第一个才能吃第二个,第三个第四个,OK,挨个挨个来,那么。井井有条,一一有序,好,它最大的好处,也是它的最大的缺点,那么这个时候我们的来了。操作就是。多线程。过来。不管是读。还是写,每次都是一个。我们are对吧?那么弟兄们来吧,我们正来看。第一种。读读。一个好读写。那么。
03:02
一个。好写读。一个好,斜斜。一个来,同学们,我们来评评理,我们来说说话。首先。我们加了这样的应用锁,没什么好说的,每次啊only one只能有一个线程进来,因为这个就等价于SYNCH,那么独读合不合适啊,当然不合适了,为什么?因为我们在读的过程当中,读是不是我们是希望是数据是可以共享啊。比如说我们现在电影院里面多线程就是指多个观影的顾客,大家都看同一个数据源,那么你们觉得电影院的屏幕是只能被一个人看到,还是应该同时被整场影院的多个顾客同时看到?那么是不是我们希望独独可以是多个?对吧,那么读写呢,没什么好说,只要沾了写,100%是要排他的,我写的时候你就不要来读,我读的时候你也别来写,我们两个呢,有个交代,对吧?那么写写更不用说了。
04:10
如果写写都可以乱来的话,那基本上跟无所这个天下大乱也没什么区别了,对吧,所以说我们现在得到的一个痛点就是说。对于。我们而言。读读我们是希望能够什么共享的,对吧?尤其在读多写少的时候,这种案例,那么最经典的是不是就是电影院?OK,播放的电影源只有一个,但是观众有很多个好,所以说我们来到了我们的第三个阶段,那么这个阶段是干什么呢?我们呢就引入了我们的。Re look OK,好,这个。接口,那么它的实现呢,也就是我们比较经典的可重入的读写所,Re en read right look OK,好,那么同学们这个时候他所能做的事情又是什么样呢?那么它的特点,第一个。
05:11
读写互斥,这个是OK的,那么好比我们刚才所举例的。一体两面,既可以切黄瓜,又可以拍大蒜,同样一把菜刀有两个功能好。你读的时候不要写,写的时候不要读一句话,切的时候不能拍,拍的时候不能切。但是呢,好处是什么?它引来的就是解决红框框这个痛点,它。读读可以共享那么多线程,并发可以访问。OK,那么这个时候。大面积的,可以容许多个县城来。读取这是它的一个优点,OK,所以说它呢的诞生。
06:02
解决了红框框这个问题,不像这个枷锁没什么好说,每次only one,我根本不管你是读操作还是写操作,尤其在这块啊。假设我们的业务场景是。读多。血少的时候。那么。读写锁。OK,那么就非常或者是什么good,因为你想啊,如果你要用这个锁读的时候,也只允许一个线程进来,那是不是有点坑爹,性能急剧下降,所以说这个就是我们的什么。读写锁的lock接口这个实现内它出现的意义那么好事。这不皆大欢喜,什么都能解决了,那干脆我就用读写锁不就完了。但是你别。只用只知其一,不知其二,任何事情有两面,有其优点必然有些缺点。那么可重入的读写锁几乎和这个是等价的,OK,而且比的功能更丰富,但是非常抱歉。
07:05
他有缺点有两个,一个叫什么写所。饥饿。问题。第二个就是要注意。所降级。OK,好,这两个是什么呢?那么为了掩饰这些东西,所以我们才推出来了我们的第四种情况,也就是我们这儿所说的,有没有比读写锁,就是比上面更快的锁,那么得到我们的邮戳所sta lock,所以说隔到这儿它才能够出来那么一步一步的演示啊,由这个缺点就导致了第四种情况,邮戳锁。踏入江湖,OK,那么这个时候我们就来说一下什么叫邪所及恶问题和所降级呢?那么来,同学们。
08:01
读写锁就像这把菜刀一样的。一体两面,可以切,可以拍,对吧?可问题是读多写少的时候,极端情况下100个线程。90个都是读,只有十个写,或者99个都是读,只有一个写,那么麻烦了。想锁的时候大面积的都是读,别忘了。他这个时候读所啊和写是互斥的,我读的时候你不能写正,写的时候你也不要来读,所以说这个会导致一种什么,如果毒所特别多,邪索很少,会导致邪索长期抢不到,活活饿死了,这个就是什么毒邪锁的邪锁饥饿问题,俗称所饥饿问题,那么第二个也就是我们本次要讲的重点。所降级,这两个所以说引出了我们的邮戳所STEM look OK,那么来,同学们回到这儿,那么大家呢,就会明白为什么从五所到独占所,再到。
09:06
由读写所再到邮戳所,这个所的演变,1234啊,挨个挨个怎么用的,就给大家做了一个说明,所以说读写锁的意义和特点就这么来。他。只允许独独共存,其他的都是互斥。大多数熟实际场景是独独,线程间并不存在互斥关系。电影院的案例多个人看同一块屏幕,独读当然要共享了。那么只有读写或者是写写读写写读或者写写OK间的操作是互斥,只要沾了这个写,那么自然而然最好是什么?一个人写完了以后,保证数据一致性,OK,所以我们引入了可重入的读写所,那么对于一个可重入读写所,同时只能存在一个斜索,但是可以存在多个毒索,但是不能同时存在斜索和毒索,你可以一体两面两种功能,用切的时候就不要用拍,拍的时候就不能用切,所以说切菜还是拍大蒜,你选一个也记,一个资源可以被多个读操作访问,或者一个写操作访问,但是两者不能同时进行。
10:17
OK,那么切记,只有在读多写少的情景下,读写锁才具有它较高的价值体现和性能体现。好,那么同学们,这个就是我们读写锁的演变。
我来说两句