00:00
各位同学大家好,刚才呢给大家讲到了读写所的演变过程,然后在最后咱们提到这个读写所呢,它本身有自己的缺点,第一个叫做所基有问题,第二个是你在读的时候不能写,只有读完之后才可以写,但是我写的时候可以进行读,就这个过程呢,是一个所降级的过程,那我下面给各位来说一下这个读写所里面那个所降级到底是什么意思?我在这里边给大家写一下,这个叫所降级,然后所降级各位怎么理解呢?其实很简单,你可以这么理解,就是将咱们的里边这个写入锁。给他怎么样降级为咱们这个就是。独酌。就是咱们一般认为啊,这个写的权限是不是要高于读的权限啊,举个例子,各位同学应该都知道那个linu操作系统,在Li操作系统中,咱们通过一个命令叫LL,或者叫LS杠,L是不是能查询到当前的文件文件夹,它里面那个相关的权限呀,比如说里边有这个R。
01:16
WX就是读写可执行,一般咱理解为写的权限。是不是要高于读的权限呀,而所降级什么意思,就是把你锁的里边这个写锁的操作降为读索的这么一个过程,这叫降级,那这个降级该怎么做呢?在这个JDK这个八里边,它说明了这个所降级的一个过程。给大家做个说明,然后一会儿咱们通过代码来做个演示,那这个过程呢,给各位同学我来画一下,那是怎么样一个过程呢?能把邪索降级为独索,首先里边的第一部分咱们先获取到这个。
02:01
解锁,然后我获取解索之后呢,并不是马上释放,咱们做第二部分再来获取到它这个读索。因为我刚才提到你在读的时候不能进行写操作,只有读完之后才可以写,但是我在写的时候是不是可以进行读的操作呀,所以它里面这个过程先获取到你这个写索,然后再获取到你的读索,然后获取读索之后,咱的下一步操作就是来释放你这个写索。那我写到这个位置,它就是释放写作。然后在我们释放之后,这个过程中又可以把你的写索最终降级为毒索啊,当然最后肯定要把那个就是最终这个读索也要做一个示范,我把图给大家画完,就是里边的这个特点。最后这个是释放这个毒索。
03:03
这个拿过来,然后咱们通过这个过程就能实现把你的这个解锁,最终就是。降级为这个毒索,这是JDK8里边它官方一个说明的步骤,咱们先回到切索,再获取毒索,最终释放解索,就可以把邪索降级为毒索,这是我们提到的一个基本过程。然后这个过程呢,给大家举个例子来说明这过程到底是什么意思,我来做个详细说明,现在说点叫锁的是不是降级啊,然后有降级是不是有升级,升级什么意思?就是你锁的要求越来越严格,而降级就是降低所要求,因为咱一般理解写的权限是不是高于读的权限啊,当然我经过这个过程把写所会降级为教读所,这是咱们提到的。然后这个过程呢,给各位举一个比较现实的例子。
04:05
比如说现在啊,我这里边有两个同学,一个是小张,一个是小王,比如说小张啊,学习特别好,他是一个学霸,然后这个小王呢,学习特别差,是个学渣,那这个时候比如说这个学渣要去抄学霸的这个作业,大家注意这个过程啊,你说怎么抄。第一个学霸是不是要开始写,学渣才能开始抄啊?如果学霸不写的话,那学渣没得可抄吧,因为你没有写东西,那我抄什么?就好比说我现在学霸开始写了,是一个写索,那我学渣要抄的话,是不是要看到他写的内容,那这里边就是一个读所,而这个时候当我学霸写完之后表示释放,是不是写完了,那我学渣是不是就抄完了,所以这就是里边的一个过程,学霸写开始,学渣开始看,开始抄,等学霸学完之后,那学渣也就抄完了,这就是咱们说的所的一个降级的一个基本过程。
05:05
但是各位注意啊,这个过程呢,只能从写索降级到读索,但是你注意你的这个读索是不能升级为这个写所的,就是我刚才说这过程,比如现在我这个学霸还没有开始写作业,那我学渣没得可抄吧,因为他没有写,那我没得可抄,所以他不能从读所升级为写作。这就是我们提到的这么一个特点,叫所降级,而所降低目的是什么呢?就是为了提高你数据的可见性,因为现在如果没有写,那我读不到,我读不到的话,就不能进行这个抄的的过程,这是我们提到的里边这个特点。然后这个说完之后呢,下面呢,咱就通过一段代码给各位把这过程咱们来做一个演示,让大家更好感受一下这个所降级的一个过程,也就是咱们刚才总结的。
06:04
这句话。我在读的时候是不能写的,只有读完之后才可以写,但是我写的时候是可以读啊,这个过程中就可以把写所降级为毒索,那下面咱们来写个例子,这个例子呢,我把这个类提前创建好了,然后在里边呢,比如说现在我们先创建一个那个就是可重录读写所的一个对象。我写一下啊。读写所的对象,那咱们直接上一个叫read read write lock。然后最终返回一个名字,比如叫这个RW log读写锁,然后这个写完之后,我分别创建它的读索,还有它的解索。第一个,比如这个读索叫read lock。这是毒索。加个注释。读索,另外有一个叫写锁,RW lock点上这个叫right lo,这个叫做写锁,所以现在我们把这几个对象我们都做了创建这个代码各位应该能看懂,然后这个做到之后,按照咱们刚才说那个所降级的过程,咱们来写一下这个代码。
07:22
那我们看怎么做啊,首先第一步是不是先获取到你这个写锁呀,那咱来一个write lock.lock这样的话是不是进行写锁,那我们知道有lo就会有什么是不是叫unlock,那这里边比如说咱就做一个最简单例子啊,就写个问方法,咱们就感受一下所降低过程,在里边比如说我就直接做个输出啊,这输出我就随便写个值了,就叫做。At硅谷,然后现在把这个执行。这个代码应该很简单,是不是就是一个简单的解锁加锁和解锁的过程啊,Atv股最终输出了,然后这个过程中呢,按照咱们刚才说的所降级过程,这句话我先注掉来看第一句话啊,这句话表示是不是获取到写索,然后获取写索之后我们进入到第二步。
08:16
我写一下啊,这是获取到这个解锁。然后第二步咱干什么,是不是要获取到这个。读索,那我写一下啊,Read lock.lock是不是读索在里边我也是加上一个输出,比如说我们就叫这个read,然后加上之后,咱们下面,比如说现在这个代码我执行一下啊,咱们看目前什么样的效果。大家注意啊,你看这代码是不是可以执行啊?A硅谷RA是不是都输出了,最终代码是不是也结束了,所以证明就是我刚才说这过程我在写的时候是不是也可以读,就是我进行写操作的时候。也能会到他这个读的这个操作,比如咱们按照咱的流程啊,咱们的第三步,我们来释放这个。
09:07
写索,那我们来释放一下啊,rightlo.unlock然后最后一步再来释放它那个读索。咱们来示范啊,readlo.unlock现在咱们把代码执行一下,大家看这里边是不是可以正常执行了,这就是一个最基础的所降级的演示,咱们在获取解索同时也能会到毒索,最终释放邪索,包括释放毒索,这个过程中就可以把邪索降级为毒索。这是咱们演示过程,比如说你在写操作的时候,也能进行读的这个操作。所以大家啊,把这个过程给他,要知道这是我们刚才解释这个流程。然后这个我们演示之后呢,咱们给他反过来演示,刚才我也提到读所不能升级为写索吧,只有你读完之后才可以写,所以我下面啊,把这代码咱们给他反过来演示一下,比如说我这么来做啊,我把这个比如我先拿到第一行来。
10:19
你看啊,这个代码我先注掉。咱们看上面。这是什么,是不是读错呀,这是什么,是不是写错,就是我先读,然后再写,咱们看现在它会怎么样。各位注意它这个特点啊,你注意是不是结束了,然后我代码没有停止吧,是不是它只输出这个read,也就表示现在我在读的时候你是不能写的,只有我这个读释放之后,或者我读完之后,咱们是不是才能写,就这里边比如加一个unlock,然后在那写可以,但我现在没有释放,那你写是得不到的,这时候我们说这个所是不能升级的,也就是说你的读索是不能升级为邪所的,你只有邪所能降为毒索。
11:06
就好比说什么意思呢,比如我现在啊,想对一个数据进行这个增加修改删除操作,大家注意这过程啊,我这里写一下。就是里边这个。增加,修改,删除这些操作是不是都是一个写操作呀,而咱们的查询操作是不是才是咱们的。读操作这各位应该能理解啊,但是你注意,不管我是做增加、修改、删除也好,首先是不是先要找到,或者先要看到你的数据啊,只有我看到之后是不才能做呀,所以咱们这些操作肯定先要进行读,然后才能写,所以就是这个过程,但是我读的时候,这里边是不是不可能不能写,比如现在我只有看的权限,我可能不能增加,不能修改,有不能删除,所以这就是它一个特点,写可以降为读,但是读不能升级为写,如果说你读想变成写的话,那这个时候只能是先读,读完之后,然后再进行写操作。
12:09
这是咱们说的所降级的这个过程,所以大家记住它这个理论给各位再重复一遍啊,咱们把这个写索降低,读索怎么做?首先第一步获取到线索,第二步获取到毒索,第三步再释放写索,这个过程就能把写索。降级为读索,但是你记住读索是不能升级为写索的,只有说你读完之后把那个读索释放,然后才能进行写的这个操作,包括咱们刚才通过代码给各位也是做了一个演示,所以大家知道这个所降级的这个过程。所以咱们现在就把这个读写所里边的相关内容给各位应该都进行了演示。
我来说两句