00:00
好,各位同学,我们继续。那么截止到目前为止啊,各位同学请看一下我的脑图。八步。为什么一到六均是普通的黑色字体,七八确实有两个不一样的地方。那么从一到六,同学们。我们通过一步一步的拆解分析,找出了隐含的bug,像这种鸟一样。完成了我们对应的潜在风险的管控和预防,那么到现在为止基本上该有的操作具备。可以这么讲,如果你是在一个。小公司并发度不高的前提下,我们自研的这个分布式锁基本上可以使用。但是。接到这儿,我们还需要有两个问题来进行考虑,一个是可重入锁,另一个是自动续期。好,这个放下不表,后面聊咱们下面进入到我们今天的重头戏,第七个案例场景,可重入所得设计和相关bug的预防,同学们。
01:16
我们来看一下当前代码呢,也就是我们的6.0版,目前这个while判断并自学重设获得所第二个set NX也包含了自然过期时间解释原子操作命令。不会被中断,一步到位执行。第三个落R脚本,官网删除锁的命令大家都清楚啊,这个是非常贴心的,官网告诉我们分布式锁的话,粘这个脚本,如R脚本,我们也给大家呢详细的讲解过,我相信到这都看得懂O了。那么接下来我们就要问问问题,6.0版还有哪些潜在的隐患,还需要有哪些的?改进点怎么来,同学们。
02:04
在当前版本,这请问如何兼顾锁的可重入性这个问题?这个就是在大厂面试里面考的最难的。请大家看我们复习一下,写好一个所相关需要的条件和规约,这个在前面给大家强调过,那么来你要想写一个靠谱的分布式所,我不管你用什么实现write to keepper my等等啊,或者你自言那么需要具备的条件和刚需第一个独占性。第二个高可用,第三个防死锁,那么也就是说必须要加过期时间,如果你微服务Java宕机了,那边到期自动消失。最后一个不乱填。OK,脚本说话,前四个我们都已经搞定,但是接下来重入性会导致我们的程序目前还不够完美,不够间断,好,那么下面我们呢,就要从guc这个角度再讲到我们的right。来说一下什么叫。
03:17
可重入性对所的条件的要求,以及了解一下我们的可重入锁。好,那么同学们,我们来先回到这。回到我们的代码。为什么我们在自己写一个锁的时候要注意这些规约?这个可重入锁?那杨哥到底是何方神圣?怎么会影响到我们的程序?来,同学们先看6.0版的程序。这一波大家是否可以把它理解为就是我们一个通过不停的自学来进行。键锁加锁的一个过程,这一波是示范,没什么好说,有点可以把它理解为啊,这一波相当于我们的一个洛克函数,没问题吧,好。
04:08
可以把它抽象的理解为这个啊,那么这一波finally是不是unlo弟兄们没问题吧?我们可以把它当做。咱们自己要干活的时候啊,假设这就是一个RI这么一个分布式锁,好吧,那么这呢,就是unri洛这么一个分布式,所你可以把它理解为这段,其实抽象过来就这么一个动作好。那接下来啊,同学们。A,线程进来解锁lock,干活没问题,按lock解锁很和谐,很自然,像大自然,自然这是你业务简单的时候。最怕的是可能他他这假设有个method。B,这么一个方法有可能method,或者说要test re entry这么一个方法,它呢,也在这儿啊。
05:14
A线程进来了,已经做完了这么一些枷锁的操作,然后呢。在这会调用这么一个方法,既将好这个方法。他呢,也要做类似于这样枷锁的操作。这个大家能明白吗?那么这是他的业务逻辑,然后这个下面。是它的register unlo啊,相当于说这段代码的抽象就等于这个,那么这个就麻烦了,相当于说现在一开始的入口是我们的第36行。A,线程进来搁到这第一次的时候,它已经流水号取得自己的线程ID分配到我进来,我进来以后又碰上了这个方法将将好,在某种业务的需要下,这个方法它也需要。
06:14
执行这个,执行这个。那么请问这个是不是在同一次请求里面同一个线程啊,那么大家告诉我第一种A线程。还是持有自己原有的锁,可以如入无人之境,相当于这把锁就是全流程可以打通。哎,相当于你进你们公司有一张信用卡,可以在你的权限范围以内刷公司所有的门,第二种你进一道门。就算是一个线程,你也要重新新建另外一把新的锁,那么你们大家觉得哪一种更繁琐好?这是我们的一个诉求,不排除你自己在索洛克和安洛克之间又要来进行针对于同一个线程同一次请求,又要来进行所的持有和判断。那么这样。
07:12
就叫可重入性,它的一个规约要求,最终它的结论是,只要是自己持有自己的锁再进去的话,不用重新新建申请,可以如入无人之境,没有必要再重新新建,自己可以持有自己的锁。他们是同意把。OK,来,同学们举个最简单的生活的案例,这个是外部的,你可以把它理解为啊,就是你每天回家的最外面这个用钥匙。打开的最外面防盗门,你们家的主门OK,好了,那接下来你一进家门里面以后有厨房,有卫生间,有卧室等等啊,假设现在这一圈里面的这个红色的就是我们的厨房。
08:14
好了,那么下面可重入锁的意思是你要进家门,咱们先说生活的案例和意思。兄弟,如果说你现在进家门的话,没什么好说,一进来是不是一定要打开防盗门建锁成功并持有锁对吧?那么请问咱们先说生活的案例,正常人呢?你不大可能在你们家厨房再安第二把防盗门进你们家卫生间、厨房、卧室里面又有锁中锁吧?那么是不是只要他们是一个整体,同一个人都是这个绿色箭堂,只要最外层进来了,假设还是这一个绿色的请求线程,那么它只要能进来,说明他已经持有锁,进来以后这把锁是不是全场打通,一劳永逸,不用再折腾重新建锁,这个就是我们对锁要求的可重入性,兄弟们,OK。
09:16
好,那么来吧。从代码回到我们的老图,听好可重索,又名递归索,这个知识是我们写所的一个规范条件和规约。我们在。B站上的勾UC2022啊,杨哥讲过的,详细说过,所以说这带着大家呢复习一下,听好可重入所又名递归锁,它是指在同一个线程在外层方法获取锁的时候,兄弟们我已经在最外层打开了我们家这个防盗门了,再进入该线城还是自己。内存方法的时候会自动获取锁,当然前提他们锁对象是同一个对象对吧?你持有同一把锁不会因为之前已经获取过还没释放而出色。如果A线程。
10:08
有了一个single修饰的递归方法,那么程序如果第二次进去的话,被自己阻塞了,岂不是闹笑话,俗称作茧自缚。所以在Java里面,Lock和S都是可重入锁,可重入锁的优点就是一定程度上要避免死锁。OK,好,那么接下来同学们,我们继续。可重入锁这四个字啊,请分开来理解。所以可就是可以,只要你自己进取,内部的方法还是要调用对应的,S也好,或者分布式所也好,他们反正都是锁的一种限制条件下的规约,都要符合这样一种特性,那么你只要进去第一道门,打开了后面的门,你只要持有同一张胸卡,同一把锁,这个时候一马平川,一览无余,全军突击。
11:03
OK,后面的人不会拦你,你都可以自动获得,所以可就是可以重,就是再次入,就是进入干嘛?同步锁那么进入什么?进入同步域,即同步代码块方法或显示的锁定的代码,那么回到我们这代码就是A线程进来,相当于我这就已经把防盗门最外侧那个门已经开了。Lock加锁乘高,然后完了以后在这块他将讲好也需要这样的骚操作,那么对不起,是不是还是同一一个线程进入到了什么?自己内部的同一块方法,持有同一把锁,也即一个线程当中多个流程可以获取什么同一把锁,持有这把同步锁可以再次进入我内部的这些方法,不用你再新建锁,自己可以获取自己的内部锁,这个就叫对锁的可重入性要求,那么现在如果我进入到这个里面。
12:03
Test re entry是不是在sell这个里面了,那么在这个里面以后我需要要重新假设要干一个洛,那么听好,这个洛和我们第一次见这个洛克就是同一把锁,OK,你不用新建,自己可以获取自己内部的锁,那么内部就对它开绿灯,一路打通,所以我只要进来了,我只要从最外层能够成功的进来了,里面的厨房,你的卫生间,你的卧室,不用再装防盗门这把锁了,因为一进来就OK了,那么这个就是对锁的可重入性要求,好,那么在GUUC里面,我们对所有这样的要求,那么在我们的red分布所里面也同样要满足这样的要求,才是一个健康的、完美的、到位的分布式所,因为你需要记录可重入所。
13:03
它重新进去的次数,并对应的进去了几次啊,就要解锁几次啊,这个就是re分布式锁,按照锁的规范对可重复性的落地分析和考虑,下面同学们请看代码。聊完了可重入锁是什么,以及它的写好一个锁的规约要求以后,那么接下来代码说话,请大家注意这个。自己可以获取自己的内部锁,不用每次新开一局。所以呢,我们呢,不能免俗。扎扎实实的帮助同学们梳理清楚这一章,允许我回到多线程编程复习一下这块知识。给同学们演示一下可重入锁,如果你没有考虑好它会出什么样的bug来。同学们。
14:00
节约时间,咱们这呢,就一类没办法程序入口搞定,那么来同学们大家都清楚,这个时候呢,等于6OBJECT对吧,来我们直接呢写个线程。任何一个多线程进来了,它呢,假设啊。放外面也行。只有这把锁,那么来我们最经典的size,好给我亲,大家都清楚这个是不是叫外层调用,你可以把它理解为就刚才我们所说的防盗门最外层T1,这个线程要进来,是不是要持有锁好持有锁以后该干嘛干嘛,这是你对应的业务逻辑,你要懂。那么下面。我们这么写synchize o BG,然后呢,还是这样的写过来,这个呢,我就把它写了一个东西呢,叫中层调用好同学们有点类似于我们请求线程,我们要建一个分布式锁,持有锁以后再进去干活,但是不排除某些时候又要锁中锁,那么这时候告诉我这个OBG和这个OG他们两个是不是应该是同一把锁,也即T1,只要能突破第一层空间以后,里面的东东应该对我是。
15:33
一切一路绿灯,统一放行的,我不用再去建其他的锁,OK,那么再来SOG。来同学们这个时候呢,直接拿过来这个东东是不是就是我们的内存调用好不好,那么来同学们任何一个人。进来了就持有锁,OK,持有锁以后请看123,看它们三个是不是同一把。
16:04
一个线程中多个流程可以获得同一把锁,是有这把同步锁可以再次进入,自己可以获得自己的内部锁,同学们请看测试,那么这个DEMO,然后呢,我们的N01直接执行,来,各位亲看一眼,大家思考,如果我们的S也好。哎,怎么跳到这了啊,这儿有一些错误的程序啊。我呢先把它注掉。这个呢,同学们呢,也已经清楚是什么意思了,先拿掉哈,来先把这个程序跑通,给同学们演示一下。大家请看同样一个线程,T接外层,中层,内层,OK,好了,那么同学们试线,如果这个不支持可重入性,我一开始获得锁,那么我这持有干完我的活,如果你没有这种可重入性的规定。
17:06
保证自己可以获得自己的锁,那么遇到这儿麻烦了,那是不是马上产生死锁,他持有我有需要,我要等着外层示范才能进到中层,中层示范才能进到内层,那别玩了,大家就在这等着吧。所以这个是你一定要。考虑进去的性能要求和功能完善性要求非常重要。好,同学们,这是我们的第一个案例,第二个案例。来,同学们不废话。我们这儿呢,N除以二,我掉M1。O吧,那M1没有这个方法,没有这个方法好说我建一个,然后我这synchronized好,那建了一个以后假设啊,我呢,和之前的一样。
18:02
我是外层调用,只不过我们这个是,我就加个OK,我干完我的活了,我调M2 m2没有来了,直接过来来,同学们。拿下我这个呢是中层调用好,我这呢调M3 M3没有直接过来粘贴拿下,那么大家请看,这个时候叫内存调用,那么来。OK,也如我掉它的时候,相当于我们的卖出一个产品,它呢调这么一个方法,哎,已经加好锁了,但是他在调这个的时候,它自己同一个它又去调M2 OK,那么好,同学们,我们呢先暂时助掉它,因为这个演示成功过了,我们回到我们的二。
19:00
跑一下。勾清loe如何?这个是不是它是我们的内线程,外层、中层、内层同样调用成功,还是那句话,如果现在M2和M1M3持有的不是同一把锁,100%磁锁,我M1加锁了,M2他要获得锁怎么办?都是等着对方,那么这个时候请大家注意。看这段话。也记影视所记S关键字使用的锁默认都是可重入锁,分两种,同步代码块和同步方法。刚刚给大家演示完成漏眼,它指的是可重复可递归调用的锁,在外层使用锁之后,我把我们家防盗门打开了进去,你不会在你们家厨房、卧室、卫生间再加防盗门,在内层仍然可以使用,并且不会有死锁,这个就叫可重入锁,也既满足了可重入的特性。简单来说,在一个snchize所修饰的方法或蛋白块内部调用本类的其他SNCH所修饰的方法,蛋白块是永远可以得到锁的。
20:10
与可重容所相反,那么不可重入锁,不可递归调用,那么这个时候就容易发生死锁,OK,好,那么代码呢,都给同学们呢写过好,那么接下来这个完活还有呢,来,同学们请看,那么你你要re lock。各位同学,我相信这个也不陌生吧,咱们这儿是不是还有第三种来搞到这,大家给大家演示清楚,好来。好了,那么这个时候呢,同学们请看线程一好了吧,那么来这个是不是就是我们的。
21:05
最外层调用,相当于在唱建立把red分布式锁干活卖了一个东西,用完了以后解锁没问题吧?好怕就怕它呢。又在这几洛克洛克按洛克按洛克听懂了吗?那么来同学们,这个也就是我们的,我写简单点的啊,内存调用我就不再加第三个锁了,好,那么同学们请看我们为了演示啊。故意停停止两毫秒,保证T2线程,现在这个时候呢,也能够。启动,但是二号线程要在一号线成之后,一句话,同样的这把洛克是不是等一号用完了,二号再来用啊,那么好了,那么来弟兄们这个一号线程。
22:06
我们用完了,那么这个呢,是不是我们的二号线程这么说能跟上好了,那么在这是我们的。外层调用洛克,外层调用洛,内层调用lock。好,我们先演示正确的情况。请把这个注掉,直接拿过来三号那么一跑是不是。该有的有T1T2T3,大家请看T1外层调用lock t1内存调用lock,自己进去自己的持有的锁了吧,然后顺利释放了以后T2外层调用,但是别忘了。可重入性一定要注意,你锁了几次啊?你就安洛克几次一一匹配,暂时相符,好,同学们。
23:07
我先这么干。暂时把T2给它注掉,没有这段代码了。下面呢,这个方法里面有且仅有一个线程T1,那杨哥你自己说的,如果你说的规范是对的,我加锁了两次,我是不是应该解锁两次,好就近的原则,洛克跟这个,这个跟这个一一匹配,两两配对没毛病。我的第一个问题,现在杨哥干坏事,我把他给注掉了,那么也就是我枷锁了两次,只解锁了一次,OK,你要是还看不顺眼,我直接就把它删掉,住都没了,100%有缺失啊。两次落考。一次,安洛克,我的问题是请同学们思考,你们觉得我现在在运行程序?
24:01
能不能够成功运行?注意右边没有报错,说明什么?编译通过了,我的问题是run time的时候,运行时候你们大家觉得这些话能不能打出来,我的程序运行会不会正确还是会报异常?请同学们思考一下,并把你的答案打在我们对话框上面啊,感谢各位同学的回复,接下来。来一组。大家看一下能不能成功运行。T1外层调用,T1内存调用,玩火。那杨哥,你这个打脸了。你自己说的加锁了几次叫解锁几次,明显不对嘛,2:1成功运行无bug,成功退出,说明这个没毛病。那么这个时候,同学们。大家想一下,Bug在哪儿呢?首先,我们的结论100%绝对正确,这是所可重复性的规约和规范。如果你看过我的B站上的勾UC2022,我详细讲过。
25:00
有兴趣的同学。去看一下,但是大部分同学不会看,这个时候回到我们这儿。加几次减几次啊,那杨哥没毛病啊,不好意思啊,他倒是不会祸害这个T。他会祸害后面的T2和其他。需要使用同一把锁的线程,弟兄们,我这块现在呢,你T1加锁了两次啊,我只解锁了一次啊。T1这个线程倒是跑了,但是这个洛克身上还记着一笔账呢,也即他自认为还有人持有我,我没有办法释放,所以将会导致后面这个T2迟迟获不得锁,就在这儿出现了卡死的情况。同学们请看我的程序调用。Know。T1外层调用,T1内存调用很和谐。
26:01
他倒是用完了,拍拍屁股走人了,但我的第二呢,永远获不得这把锁。明白了吗?所以说一定要注意这种情况下,就是为什么要保证一个所谓的可重复性,你落可。洛克安洛克安洛克,有可能同一个线程T一进来了,它内部处理一点业务,还要再加一次锁,所以你一定要判断并保证锁的可重入性,这个就是我们写right分布式锁的一个重点和难点。OK,好,搞到这我们来讲解一下。Sized可重入的实现机理是这样的啊,每个锁的对象都拥有一个锁的计数器和一个指向持有该锁的线程的指针。当我们执行模ENT就是进去就把锁的时候,计数器为零的话,那说明它没有被线其他线程所持有,就是第一次来调用。那么Java虚拟机将该对象的持有线程设置为当前线程,并将计数器记个一。
27:09
在这第一次进来。没有人用,首次用的是T1,这个线程加了一把锁,这个就是lock t1线程首次使用,那么这个对象上面天生带这个计数器,每个对象都有啊。它就标完了一个一好了,在目标所对象计数器不为零的情况下,如果所对象持有的线程是当前,那么呢,Java虚拟机可以将计数器再加一,否则需要等待直至持有线程该示范,那假设我T1线程,我又进来一次,上面的计数器变为二,所以我加几次,我减几次,一一对应匹配通过,OK,那么最终计数器为零代表被释放。那么搁到这。这个是影示的所SYNCH的,那么我们这显示的所说的刚给同学们讲完,所以它也有这样的可重重入性,那么所以说就是一句话,我们把这个注释呢,给大家呢写清楚。
28:10
这个就是我们这节课的结论。在一个SNCH修饰的方法或代码块的内部调用本类的其他S修饰的时候,是永远可以得到所得,这个就是可重入性要求,OK,那么好,兄弟们。一点点明白这个特性以后,那么接下来我们就要开始重新改造我们的第七版的red分布式锁,让它满足可重入性,说到底就是要符合aqa源码里面对锁的全部特性要求。前面给大家介绍了可重入锁是什么,以及它的性能和工作特性,也即在我们日常的工作过程当中,对于同步代码框SYNCH,对于我们的同步方法,对于我们的lo unlo,只要是同一个线程以内自己持有自己的锁的话,往里面进。
29:10
那么从外到内,它是应该一马平川,一路绿灯的。所以如果我们在过去的夜务过程当中碰上这样一种情况,进来赛这大段加锁,你可以把这大段功能折合成一个叫洛,那这一大段成了一个叫安洛克,这个没问题,但怕就怕。在调用这个方法洛按洛之间又调用了这一个方法,这个方法里面相当于同一个线程进来,哎,它也需要去加这把分布式锁,那么就存在着可重入的现象,所以同学们结合业务,那么我们来思考,但凡你要写成功一个所。
30:01
相关的全部功能要求必然而然就要去参考我们的aqs源码规范特性,因为在勾C里面lock and lock,我们实现的lock接口是所有写好一个锁全部的顶层规范和要求,那么简单而言,我们呢,过来看一下我们对应的源码来,你重入了进去了几次,你出来就要解锁几次。各位亲,回答我们的代码,我们大家都清楚这个东洞是不是就我们的lock接口像这样一个东东,那么一样假设到后面我们自己写一个red分布式所,那是不是也可以等价于假设啊,你有一个我们叫my red lock,这个是我们自己写这个分布式所,和这个一样,我也要实现lock接口,那是不是就满足了全部的规范,那我们这样写的。
31:02
的所才叫靠谱,才叫是什么企业级生产上可用的,那么来同学们我们来看一下,首先如果看过杨哥GUUC2022对应的高频发展这门课程,对于aqs的源码我做过详细的分解来都清楚,对外暴露的教一个可重入锁,实际上而言是实现了lock接口,那么它底子和内部有种东西叫什么aqs,那aqs其实而言lock方法我们打开,我们找一个最经典的最常用的非公平锁啊,这些是什么?我默认你已经懂了。第一道请看CS是不是状态,我期望值是零,这把锁没有人抢占的,如果期望值跟真实情况一样,我加个一,就代表我持有并锁定了,并且把当前独占这把锁的设置为当前线程,否则的话,大家请看这有个acquire,那么acquire,这有一个try acquire尝试去占用,那么我们一层层的方源码,我们还是以非公平所得在re en的lock考同学们请看在这这一段就是我们要考虑并要设置的参考,我们来稍微解读并分析一下当前请求线程进来,那结合到我们这儿,比如说A进来啊,访问了7777,它要去调用库存模块,那么为了防止超卖。
32:30
基本上要在register这边持有,或者说建立一个register分布式锁,那有可能还是自己抢到,第二次也还是自己抢到,或者我进来以后内部再调用一次,存在着所中所中情况,那么来同学们请看get c,得到这个C,如果C等于零,太好了,说明什么?根本就没有人来占用,哎,它是什么?一块空白的,那我就如入无人之境,那么就是我,所以零希望值就代表没有人。那么过来这儿加个一,前面也看到它永远是传个一对吧,那么设置我们自己现在独占的线程,就是当前线程,那么也就是我们这儿所说的这个A想去建,哎呦,查了一下发现根本就没有这个K建设成高,那说明A独占成高,那么把它设成A请求线程to搞定,那么否则的话,大家请看有可能出现这种情况。
33:31
进来了以后,我调用一个方法,这个方法还是自己,他也要去跟ready分布式所拉上关系,那么搁到这儿,同学们请看当前的和这个相等哟,还是我自己,此时next就等于这个C再加上A块,那么同学们都清楚啊,如果已经占用了一次,上一把这个C是零,那么设置了以后,这个C是不是S塔,这个值要就是这个C值是不是被设成一啊,那么现在是不是一加一又来一次,说明它占了用了第几次啊,第二次啊,听明白了吗?那么同理,我解锁是不是要解锁两次?那么看看到了这个东东也就明白了我们aqs规范它对可重性的要求,基于此我们就会清楚,如果待会我们要写一把生产上能用的靠谱的分布式锁,100%也要符合我们AQ AA aqs里面对洛克。
34:31
接口的规范,那么我们就要思考我不但要锁得住,还要保证可重入的技术问题。那么大家思考一下当中哪个数据类型可以去替代,直白的说一句,如果你只是在一家小公司啊,你用个set NX啊,完全足够了,你不用考虑锁的可重入性,哎,反正就是用完G山,但是如果业务很复杂,你这把锁要靠谱见状,各种极端环境,极端条件下都要能够满足,就要保证在sat NX基础上再加入可重入性的考虑,要有一个锁的重入或者是进入的计数器,那么这个时候set NX是不足够所使用的。OK,那么接下来同学们我们的期望值就是比如说我们的K。
35:25
是叫这个。好了第二个,那么就是我们的UUID,然后呢,我们的线程ID没问题吧,那么这是key。Value,然后我还希望,比如说我进来了以后,我们这儿同学们如果他进来了,就是一次又进来了一次,两次,又进来了一次,三次,说明什么,我们这是不是K不到,但是这个value我又希望它是一个KV建值队记者是哪一个流水号的线程,它进来了几次,还有个计数器,那么对于这种结构,同学们思考一下,我们是不是就是我们的KKV这种东西,也即真真正正你要做成功一个分布式所,我现在就告诉你这个结论,Set NX不可以。
36:21
必须要用h set,用我们的哈希结构,只有它才满足KKV这个K,这个K就是我们的,比如说杨哥的ready所这一把,我们这个value就要实现KV建持对,保证你进去几次并计速,所以同学们老我们应该这么干,我们的分布式所K还是它value,就这个U悠ID流水号加线程ID,那么假设它已经重铸了11次,我随便乱写的啊,这样索成功,那么这个时候type我们要用哈希,而不能是用我们的string。好,各位亲,看我案例命令演示第一步H你可以用exi exi exist是否存在,或者是那比如说啊,就这么一个假设,我们呢来看。
37:22
看一下有没有这么一个杨哥的register所这么说能跟上好第二个HR。那么这。啊,这个写错了啊,我们重新改一下,那么这个key应该叫red lock,对吧,不是redk手误啊,好,有没有零,但是是不是代表没有,没有的话,我现在是要新建,那么h set哪一个,那么杨哥的red lock这个field,那么比如说啊,我们这呢,就拷贝过来了,假如说啊这个流水号,那同学们就是我们的这么一个东东,这个F的就是它相当于这个是流水号,这个线程ID是一号,这个Y6是一,这个Y6是不是一默认它第一次进来,那假设后面它又进来了呢?那么同学们h set可以新建没问题吧,那么接下来咱们是不是h increase by,如果它又进来了,相当于这段代码的变成,那么是不是就是HRBY哪一个,那么杨哥的ready。
38:35
哪一段这一段他又进来了,加个一,再加个一,再加个一,这么说能跟上,那么h get哪个来?Red lock field是哪一个,是这个请求流水加线程ID1号,这个线程你进来了几次啊,总共进来了四次,那么同理,我加锁了。
39:03
四次洛克是不是要检索四次,所以在这儿,那么搁到我们这儿是不是也同样是H1K半,那么我这就是个负一,那么现在安洛克了,退出来,退出来,退出来,退出来,如果到零了,说明已经加了几次,解了几次,一一对应完成,那么最后咱们是不是要用delete塔,就把杨哥的这个red this lock删除,并且乘高,那么返回一是就删除成功,那说明这个线程不但抢占所成功,而且可融入性问题解决,这个才是我们最终实现所考虑的,OK,好,那么所以说做个小总结挺好,Set n X只能解决有没有X锁这个问题够用,但是不完美h set不但解决有无,还给你进一步解决了可重入的问题,所以真真真正的你需要思考。
40:04
啊,并设计的是应该用h set哈希版代替我们STEM版的center X这把锁,直白的给大家说一下,如果你在面试的时候,人家问你请说一下red分布式所你要用哪个命令,哪个数据结构啊,Set NX的基本上可能只能对标一个中级程序啊,如果你能说h set呢,用哈西这样,且表示要用解决可重的问题的这个才能对应的一个高级程序啊。OK,好,那么同学们这通过详细的分析和命令操作和讲解,我们就给大家说清楚了,为什么我们的right分布式所慢慢的进化要拷入锁可重入这个问题,不可以只使用sin n X,必须要用h set这个结构来搞定我们的right分布式锁。
我来说两句