00:00
好,同学们讲完了同步代码块,那么接下来我们来说一下SYNCH的同步方法,那么通过前面的讲解,我相信对这个图同学们应该有个明确的认识了,说白了就是同一个线程可以获多次获得同一把锁,OK。好。那么前面我们已经讲完了,我们的。同步代码块,那么接下来一样,我们来试试我们的同步方法。那同学们。Public s VO me。那一进来以后就像加了把锁,这个就跟刚才一样,是不是外层。没问题吧,那么现在有M1类以后。我现在要调一个方法M2。它呢,也可以把它当做。一个同步方法,那么同学们你清楚的如法炮制,这个是不是就是我们的?
01:04
中成循环,我们就省写了,OK那一样。在这块以后是不是来进行我们的M3,当然M3我们也就停了啊,里面就没了,那么这个时候就内存循环。好了,最简单的三个,这前面是用同步代码块,这个是用同步方法,那么弟兄们你清楚的。直接过来。第二,M1,那同学们就跟刚才一样,是不是M1的话呢?1233个方法,外中内,如果不出意外,是不是都可以正确答出来,OK吧,深刻体会这句话。外层调用以后,内存仍然可以调用同一个线程,可以多次获得同一把锁好,那么这个呢,就是我们的影视的同步块和同步方法的一个代码级别的证明啊,因为这个呢都很简单,一说也应该就能够整明白,那么注释都给大家写好了,那么它深层的底层原理是什么呢?
02:08
首先我们原来讲过一个问题。我们从自检码的角度呢,说过这个关键字啊。如果我们反编译了以后,我们大家都清楚。对于任何一个snchize的这么一把锁,这个对象,如果我们用Java p-C这么一个命令编译的以后,假设这样的方法,它不是有个东,它是不是有个东西叫monitor entry和monitor。Exit进和出,但是这我们是两个,为什么多出来这么一个,原来讲过了对吧,都详细给大家说过,异常的时候要保证它彻底释放所和退出,正常情况下是不是加一次锁就释放一次锁。一一配对,所以说size的关键字在GVM层面,底层是有这么一个枷锁。解锁OK吧,那么好,同学们回到我们这里以后,我们来看看这个可重录的实现机制。
03:05
首先每一个所对象就是我们这儿的,我不借。OK,刚才就是我把它那个啊,刚才删掉了object a的那个还记得吧,它干了些什么事啊,都拥有一个锁的计数器和一个直线持有该锁的指针。当执行加锁第一次进来的时候,目标对象计数器为零,如果它没有被其他线程所持有,那么就是零嘛,否则的话就说明什么,我抢到这把锁了。将会计数器加个器加个机,在目标所对象计数器不为零的情况下,就说明所对象的持有线程是当前线程,有人用着,那么Java虚拟机就将其加个机,否则需要等待,直至线程示放开锁,那么这个时候我们才能抢到,我们当执行这个的时候,我们Java虚拟机呢,就会将这个所对象的计数器减个一,如果为零代表所就可释放,所以说一般S关键字就是。
04:02
N进来退出加一个减一个一正一负表正表示所的持有和13,那么我们下面呢。了解这个底层原理以后,我们来看看我们的显示锁干嘛?Re en look,它也是可重入锁。好,那么在这儿给同学们来进行一下相关的验证。好,那么上面呢,省得大家看着,因为这个代码都非常简单啊,看着大家眼运,我把它删掉。来,同学们啊。那么假设啊,我们的lock lock等于new re lock,那么同学们。没有任何问题,这个不讲了,OK,到二厂这个层次了都应该明白,那么现在呢,我们这个main方法是只是一切程序的入口,我们现在呢,先来第一个线程,那么尿。Thad,那假设兄弟们啊,这个是T这个线程好跟刚才一样,以前我们是不是加S啊,刚才是不是加了一个什么look哎。
05:02
这个呢是什么?我们的可重入锁现在不这么玩了,那么。克,UN洛克,那同学们我这省略了啊,这就是外层调用这一波没什么问题吧,你懂的,这个没方法一执行,洛克按洛克这有什么好说的对不对?加锁嘛,加一个一就像是什么示范所,就减一个一为零了,说明没有人占用自由状态,那接下来我们又来一个问题,Try look。你看跟刚才的一样,是不是外层调用以后,这个里面是不是就是中层调用啊,当然我这呢就写省写一点,这个是不是就是外层一个叫内层,同学们这个没有任何问题吧,Look。最外层加了个锁,然后你告诉我,这你看根据idea的高量显示这五个高量部分是不是同一把锁,那么现在是不是可重入锁,就是指同一个线程可以多次获得同一把锁,OK,不用等着是吗?比方说第一次落克以后,你是不是应该有个安洛克,相当说我这儿不用等着一个安洛克,我这还可以再次获得,那么同学们,我们先来个最简单的啊。
06:11
大家看这是不是外层,这是不是内层,能理解你一定要两两匹配,一一配对。那同学们,洛克。这一波没什么问题吧,那么再过来这儿。按lock同学们可不可以,那么你落了几次啊,你就要什么加锁了几次啊,最好就要什么解锁几次啊,这一波同学们能跟上,你看外层和内层没什么问题吧,好,那这个时候哈,同学们要注意,你可能会说。那杨哥,我偏不这么干。什么意思呢?我。违背你的诉求。在注掉之前是不是都是加了几次减了几次,内外有内外匹配,两两配对,加几次减几次,那么你告诉我,现在如果我把它注掉了,我还能用吗?
07:05
大家思考一下。好。跑一下。没什么问题啊,哎。那杨哥你讲的好像不对,哎。甭着急,我们先给他恢复啊。然后呢,我们这儿再来一个线程。好理解。T2,没问题吧,那么一样。这个呢?就是我们的。另外的我们的T2线程。调用开始OK吧,那么如果T2成功了,我们呢,直接呢给他弄出来,那么下面。我们来跑跑。T1的外层内层T2调用开始OK吧,都挺和谐吧,那么为什么我刚才一定要在一再跟大家强调一定要两两匹配,加一次就要减一次呢?那弟兄们。
08:06
我干坏事我得干掉,刚才我们看过了,干掉了以后T是不是也可以正常使用,但是这个时候我们来跑一下,我们来看看。有外层内层,说明T1成功调用了,但是非常抱歉你把这个注掉了,它的加一减一层次不匹配了,你倒是可以爽了,别人是不是迟迟没有办法获得你这把锁呀?这样就特别容易导致死锁,或者是其他的一些生产故障和问题。那么所以说同学们在这儿这个可重入锁一定要注意干嘛呢?我们一般而言啊,加锁次数和释放次数不一样的话,第二个线程就始终无法获得锁,导致一直在等待,那么正常情况下我们加几次叫什么示范几次,请同学们一定一定要注意这个细节,这一波请同学们能理解,所以说呢。
09:01
千万不要这样啊,尤其用手动版的洛克安洛克,你用人家自动版的GVM底层可能会帮你做一些,你自己用这个洛克安洛克,那是比较要你的命的,OK,那么好,同学们。我们呢,再来看一下,又回复成原来我们正正常的lock lock对吧,上面就是可重复,OK,你正常的加一次减一次,正常示范下面调用干嘛,一切和谐,这是第二吧,那如果说你干坏事是吧。把这个洛克给它注掉了,你自己提现。表面上看你运行的好像挺和谐挺顺利,T1是正常的,但是别的线程等着你获得时,由于你这不匹配两次洛克,但只有一次安洛克,那么别的线程,比如说T2就迟迟没有办法获得你应该释放的,所我没有办法跟你愉快的一起玩耍,听懂。所以说呢,请大家一定要注意,这个就是我们的可投入所加几次。
10:02
犯几次?
我来说两句