00:00
好,那么同学们,咱们呢,第二板斧可重入锁就叫递归锁,两个是12121的事。接下来。第一盘符理论,第二盘符,大姨妈说话,第三盘符,咱们直接小总结好。调一下音箱。好,我刚才音箱有点小问题,来,同学们,我们继续。大家请看。再读一遍理论。同一个线程外层函数获得所之后。内存递归函数仍然能够获得锁的代码。它指的是在同一个线程,在外层方法获取锁的时候,再进入内存方法会自动获取锁。也就是说,线程可以进入任何一个它。已经拥有所的所同步的的全部代码。强调,假设这个线程进到了master z,你跟我讲它是不是要拥有这个里面的全部代码,那刚好这个里面的代码,这个也是一个同步方法呢,照样全部拥有,明白好,那么同学们老规矩。
01:16
都写。杨哥讲多线程的时候。是不是给大家简单的说过一个东西叫线程操纵资源类,说过了一言不合先整个资源类手机,就是我们资源类没问题吧。怎么呢?过来public考。Send的SMS,那么呢?言下之意是干什么的?我们这省得待会儿会泡一场,我就先透个哪了,听懂。回答,我这个是不是个同步方法。好。兄弟们。干嘛呢?我目前主要干的事情是这样。
02:01
来。我们为了好说,用ID也行,这次我就点get ID。加干嘛呢,我现在是不是调用的是。兄弟们,短信这个方法听不听得懂?Invoke的短信,这个方法好。兄弟们,资源类里面手机有一个发短信的功能,是个同步方法。够简单吧。咋啦?现在,兄弟们。有个发邮件的方法没问题吧,那么这块我是不是以后考发邮件听懂。好,那么这块为了给大家好区分,那么故意长一点加个井号,注意。现在短信邮件是不是都是同步方法?看好。线程可以进入任何一个它已经拥有所的所同步骤的代码块。
03:05
下面杨哥干的活是这样。我进来这个同步方法回答我第八行是不是就在这个同步锁里面了。怎么了?我在调用邮件这个方法,注意短信要邮件,邮件跟我讲是不是一个同步方法。能不能,那这个时候就要判断是同一把锁还是两把锁。所谓可充数过来看。理论知识啊,待会儿念。那么现在。二话不说。干嘛呢?这货是不是我们传说中的线程操纵资源带?来。直接现在这或是我们的T1线程能跟上。T1线程你干些什么事?线程操作资源类,我发送短信,同学们听不听得懂?我调用这个。
04:08
能不能跟上?然后。过来。几点下来?第二。我在调用,注意G2没找别的找谁。还是短线听没听到你跟我讲,只要是六这个T1和T2他们的ID1不一样。T1T22个县城的名字不一样,两个同学你们的名字不一样,那学号是不是肯定也不一样?那么言下之意就是我一执行以后,假设T1,它的线程ID我随便乱说的啊,是17。那么言下之意说是17号线产。17号线程进来,这个值就应该打印,17调用了短信方法,第一行能跟上,但是注意由于它是可重入锁。
05:02
我进来这以后,你们跟我讲,我们这一行应该是17。还是别的数字好。还是17,我说过了,你开了你们家大门,然后上厕所,跟我讲是同一个人。好,兄弟们,这个时候请看。我们的运行情况,这个时候杨哥的代码一跑。12INVOKE这个言下之意是不是T,我我演示了两次啊,回答我兄弟们T1,当然现在他是分配给是12啊,我刚才随便乱说,是不是说过17啊,它是什么意思啊?请同学们过来可可以看这个时候是不是变成一种非常微妙的关系。12首先反问的是发短信这个森克纳从不看法,对不对?他先得到这个回答,我现在这一行是不是就是我们这这一行。
06:00
请看12号线程send到SS,但是再过来调邮件的时候跟我讲还是12号线程,说明是不是同一个线同一个线程,反问两个不同的最后量的同步方法,但它却是持有同一把锁,听懂了吗?能不能理解,那么这个时候请同学们干嘛?把这个弄过来了以后干嘛?你要是不方便,要不这样吧,同学们要是觉得看着眼拙,我点get name。我还是给它换成内哈,那么我们再跑一遍。线程叫T1和T2。请看T1发短信进去,邮件听不听到,有点类似于就是同步方法,可以进入另外一个同步方法,听懂了吗?那么这个时候同学们请看。杨哥的这个程序。
07:00
我把答案写出来以后,请同学们再读一下。这段话看看有没有一些新的体会。Car。但他也给了大家一点点时间做课堂小理解,请看。同一个线程外层函数获得所。我们这儿请看T1T1,你看第一步T1。调这个是只调了发短信,但是我们的答案是不是既有发短信也有调用邮件啊,什么概念?同一个线程外层函数T1,现在的外层函数是不是就这个短信方法。是这个第六行这个。内存递归函数仍然能获取该锁的代码回答我,我们T什么只调用了?短信,但是跟我讲,我们的答案是不是既有短信也能调用了邮件。换句话说,这个相当于外层,这个相当于什么内层S,这个相当于。
08:05
你现在放学回家去你们家的租住的那个屋子最外层的大门,你进去以后,你进你们家厨房,进你们家卫生间。不用上锁,相当于对我。只透明的,我能够获得这把锁,明白了吗?好,那么同学们。我们从这也就是说在同一个线程回答我,我现在是都是TC。T1,在外层方法获取锁的时候,在进入内存方法会自动获得锁,能理解了吧?那么也就是说这句话就是在。那么言下之见,杨哥把这句话拷贝。T这个就是同一个线程,就是指。信一线程在外层方法获取锁的时候。在进入内存方法干嘛?会自动获取锁,所以说有点类似于我在一个同步方法里面再访问另外一个同步方法,我可以自动获取锁,所以说我能够调度得到邮件,这个方法听不听得懂了。
09:13
好,那么这个就是我们的什么S可重入锁。作用是死锁那。杨哥,那这个呢。你没证明啊。同长期你看。深、透、明、细,就是学技术的四大维度。不留死角,那杨哥再给我写个原著的洛克是不是?这种方法是不是线程操纵最赖?二话不说,走起音runable回答我,兄弟,我是不是要实现一个wrong方法,同学们能跟上。为了跟上面区分,我写在一条小短信下面。来吧。Run方法首先假设我随便乱写一个get方法。
10:04
干嘛呢?过来。注意啊。我现在是不是说他们就是他们两个就是一个典型的可重入锁。那么言下支线杨哥写到现在。K one。是不是证明了size啊?是一个典型的可重入锁肺部没问题吧?那么现在杨哥要给你们写。Case拓,也就是主车的落卡就是一个典型的。也是一个典型的可重入锁,这一步听不听得懂,那么过来干嘛呢?那么既然是人称的洛卡,二话不说,哎,我去。那么这个时候我们是不是瑞?安全套。这样吧。Lock lock考等于六,Repent落考,同学们说过了,跟我讲这个默认里面填的是什么?
11:03
非公平锁好,那么来吧。我们这要有get,那么影下public VO主页,我这可没加think,听不听得到干什么呢?Run方法我调的是get方法,那么好。哎呀,这个快捷键。怎么一下子给我出来了,好,那么get方法来。现在。Exception。我们干嘛呢?我这是要有个get呀。好。取消吧。我们用TRY来,同学们。现在串。洛卡。Lock这一步能跟上,那么言下之意,我是不是要跟你们证明,Re to lock也是一个可重入锁呀?跟刚才的证明方法一样,那么这块也不会报什么异常,干脆我就扣个哪创final里了,那么干什么呢?
12:03
直接在拷贝。兄弟们。赛吗?好。Rab接口是不是要有一个run方法?这个run方法调调get,那这个get。咋玩呢?这个get跟刚才一样。这个只不过叫invoke get方法,那么get方法干什么?正确,是不是又去掉S?那么你懂的,现在是不是get look unlo that是不是也是look unlo,听不听得懂?那么这个时候,兄弟们。我在外面拿了这把锁,现在可不可以一马平川,如入无人之境,也能够获得我洛克,里面又含有洛克的这个set方法呢?那么所以说。哪块?弄过来。那么。
13:00
怎么了?Set invo set,那么言下之夜,兄弟们。Get run方法。是这个接口里面的没问题吧。他呢?找get get是一个lock,按lock了打印出自己,且同时还能不能访问持有同一把洛的,你看现在这个lock没问题吧?好,那么同学们,我们呢,继续。这个时候是不是就是我们的。T3,听不听得懂?那么这个手干什么呢?Four。第二个方法,空气。不是这么掉的,那么这个时候干什么呢?干脆吧,就这样。Thread。T3等一。你。Thread同学们,这一步OK吧,那么这个时候干什么?这个资源类是不是已经实现了我们的re接口,那么这个时候兄弟们100%是不是可以丢进去?
14:10
好。这是第四。OK,第三。Start第四,Start回答我上面这种方法是我们传统的think,下面种方法是我们的look look听不听得懂,那么O呢?那么假如说我们这呢,为了好看。我空格四个,那么这个时候同学们,我们直接来将其反问。好,那么这块干嘛,哎呀,稍等哈。那么呢?干什么呢,这块我是不是先让上面先完成,听懂了吧。那么假设我睡它一秒钟,先让上面完成,听懂了吧,然后再找下面这个是睡是谁,那些沉是不是睡了。
15:02
好,那么这个时候干嘛?为了让不睡也行,只不过那个效果是不是不是特别好看啊,来,兄弟们。T1,那请看T1太快了,好,我们这儿可以看到一个情况干什么呢。再来一次。程序是不是已经对了,其实。好看了吧,兄弟们。我们的T1T2可重入锁,是不是听了这话?是S版本讲过了,我们现在用洛克,请看我们洛克干什么呢?可以这样。第三。这样是不是让同学们看着最顺眼啊?来。再执行它一次。第三第四我点。请看。
16:00
现在是不是和谐啦?兄弟们请看。我T3。我实现了。Look这个look啊,Look没问题吧,注意现在这个get方法里面是不是叫set set身上是不是也带着洛克啊洛克。所以说你看T3进来,抱歉,T3他过来干嘛,我们这种方法调用,是不是永远都是去找这个run。这个run是不是只是调get,那么这个get说明T3和T4都是先调了这个get,方法同不同意,但是你看调get也好,T3GET t3调没调用到sat。T4GET t4第二枚倒影叫赛塔。能理解了吗?好,下面。再请同学们看一个小细节,现在杨哥犯贱。不是,你不要笑我,我,哎呀,我不是那个意思,听懂了吗?干嘛呢?
17:12
我这么写。你们觉得行不行?课堂十秒,思考十秒钟。好,那么来,同学们大家思考了一下。这道题目呢?是我故意的,为什么呢?就你们的学长接到了阿里的电话,面试。我就在旁边听着呢。他答出来,Look look。Unlo在try finally的写法。那么好。那边的考官直接就说了。可以。下面我想问你的问题是。我如果加两层锁。还能不能够运行正确?他的问题原话是第一个编译失败。第二个编译通过运行失败。
18:02
同学们,请看我们现在idea语法的右边没有一个是爆红色吧?首先从语法写。Look look。语法没错。那么刚才让大家考虑的是。运行什么情况,能不能成功,大家请看一眼。好不好?CO0成功退出说明什么?只要你锁。匹配。有洛,有按洛。几把都可以。听到。再说句正确的废话,我现在问你,我再加一次,第三次正不正确?OK,所以说干嘛我们实际工作中不会去这样加两把锁,但是坑爹的货就是什么面试机,他会那个。他会看你的是什么。基础知识掌握的如何?那么听好洛克啊洛克,那么谢阿棉,只要你配对。一对。
19:01
两对配对就行了,那个大致看。我缺了一个。首先。右边没有报错,说明什么语法编译通过同不同意,但是注意二。一。说白了,你现在去卫生间。两个门栓。你最后只解一个,你觉得你能不能出来?好,那么这个时候同学们都一样,你们认为这这时候我在运行是报错。还是怕死?我点。大家看。西四根本就没有出来。因为什么你T3GET你也找到了set,但是进去以后set里面有lock and lock,抱歉,最后一把锁是不是不匹配呀?
20:06
请看。程序并没有出错,但是红框框在这儿亮着,说明程序是不是在这卡死了。那么这种情况下干嘛注意你用这些东西。一定要。加锁几次,然后干什么?解锁几次听懂两两配对,有申请将有示范,有申请将有示范。明白那么好。最终我们回到。我们的。是什么?请同学们按照刚才老师写的可重复所在,认认真真的读一遍。好,那么来,同学们,我们回到我们这儿,现在。
21:00
回答我。线程可以进入任何一个它已经拥有所的所同步的代码块。你看我把这句话拷贝。比方说粘在这儿。某个线程可以进入任何一个,它已经拥有锁的。所同步着的代码块。我进来这个get lock,我是不是拥有这把锁,我锁着的什么锁,同步的代码框能理解了吧?所以说这个就叫可重入锁,好处是什么?避免了。词组,那么切记,两两配对非常重要,加几次你写几次?这个是阿里电话面试考到过的原题。他就问你加两次对不对,编译能不能通过,编译能通过运行能成功,只要你加几次所几次听懂,但是实际工作中同学们懂得我们加几次啊,是不是都加几次啊。
22:03
对吧,OK,那所以说代码给大家改回正确,重点就。好,我们对可重入组的介绍和代码的讲解就到这儿,再体会杨哥说的那句话。现在跟我讲,你们再来读这段语文小课本,是不是理解就加深了?理论。代码小总结,学习三板斧,你跟着杨哥永远拿第三板斧去学,你一定能够掌握,学习一定要是深透明细,你读书没用,你这个知识点你觉得你理解了,你能不能用代码把你所理解的知识点拿代码编出来。这就是一个好的程序员。你不用去给我什么,跟我们满天飞,哎呦,杨哥加va大数据都交,整天只知道卡夫卡activity MQ是库Li。大哥重点在这儿,这些不变的这些学习能力的基本功。
23:02
这些才是最重要的。天天在那转那些基础名词顶个屁用啊,什么叫什么?用SKY拉的就比Java程序员牛逼啊哦,用Java的就比更牛逼啊,用Python的就比够强,哪那么多程序员的鄙视链啊。那说白了,把这些不变的根本掌握了才是重点,好,那么同学们,我们下课休息一下。
我来说两句