00:00
到这儿,我相信大家对可重入锁应该有一个基本的了解了,说白了就是同一个线程使有自己所获得的同一把锁,自己可以获取自己内部的锁。我们通过同步块同步方法向大家说明了影视锁size默认是可重入锁的相关案例,那么接下来我们要思考一下,他为什么能够实现这样的机制呢?来简单的回顾一下我们之前讲过的一个问题,为什么任何一个对象都可以成为一个所?大家还记得它吗?我们当时给大家打开过,看过每一个object monitor,说白了它就是一个监视器。哪一个线程持有。所,那么它都会在欧这个字段来进行一个记录,指向持有object模对象的线程。OK,那么所谓的可重入到底谁重入了?重入了几次啊,他为什么不会错,别忘了下面还有两个参数,第一个锁的什么重入次数,他给你做了记录,第二个这有个什么。
01:06
看俗称计数器,用来记录该线程获取锁的次数,哎,所以说呢,我们这儿呢,就可以获得S,它重入锁的实现机制啊,它是这样的。每个锁对象都拥有一个什么锁的计数器和一个直线,只有该锁线程的指针就是我们刚才所看到的那个欧和那个计数器,当我们执行模ENT进去的时候,如果目标所对象的计数器为零,那么说明它并没有被其他线程所持有。哎,此时Java虚拟机。会将该所对象持有线程设置为当前线程,记录好现在是谁进来,谁持有这把锁,并且将计数器加个一,那么在目标对象计数器不为零的情况下,如果所对象持有线程还是它自己,那么Java虚拟机可以将计数器加一,OK么?相当于说这个时候加一次,那么相当于你可重入了,否则就需要等待直到持有的线程释放该锁。当我们执行模拟。
02:06
Exit的时候。虚拟机又会将所对象的计数器减一,计数器为零的时候,就代表我们这个锁已经被释放,哎,所以说说到底,根子还是它每个对象上面就有这些记载的相关属性,谁进来了,谁出去了,记录的次数,重入的次数,你要一一给我对账,对得上好,那么接下来我们来看一下。显示锁lock,那么也就是我们的lock同样也是可重入锁,那么下面代码证明,注意影视是SNCH关键字啊,Java内部的人家天生就具备,而显示啊,说明你在使用的时候你要注意可重入锁这个问题说直白点就是锁了几次啊,你就要示范几次。好,那么同学们,下面。我们呢,来看一下,在这呢,我们比如说sta。
03:00
嗯,写在外面吧。写在外面。那么lock。Lock等于new rein lock,这有一把锁好,那么各位同学,那么现在啊,这个是T1。那么穿?洛。Look,这波没问题吧,那么同学们和前面的一样。那么现在T1持有所他进来了。这把锁洛克他抢到了,那么当然是他要干活,证明我进来了,然后和之前的一样,同一个线程持有同一把锁,进去以后不能出现死锁,不会产生尴尬,所以说他这儿进来了以后,那么假设啊,他们in我们这儿呢,就叫。外层。调用这是T1的没问题吧,那么再次进来以后。大家请看。现在是不是洛克对着一个洛克,洛克对着一个洛克,再回头读读我们的这个机制啊,是不是计数器清零,那么进去的时候叫加一,解出来的时候计数器就减一,清零的时候代表它被释放,哎,它就是这么来的,所以说所谓的显示的调用,那么你作为程序员,你一定要注意用look的时候,一定要是什么lock按LOOK11匹配好,那么同学们,我们在这啊。
04:24
那到这儿我们呢,这个就是什么。内存调用好吧,那么lock lock按lock按lock,那么就近的原则,这个跟这个对,这个跟这个匹,那么来我们看一下同一把锁可不可以还是可重入锁,首先点一下。等程序运行。大家请看同一个线程,Come in外层调用,Come in内存调用,充分证明我们的T1线程所持有的落,也即我们的re en的洛克也是一把可重入锁好。那么下面有两个问题。
05:02
进一步深度的讲解,请注意。那杨哥你不是说lock几次啊,叫调用几次,加了几次啊,叫减了几次啊,Lock了几次啊,叫按lock几次嘛,要一一匹配,我不像我就不信这个邪,那么现在。我把这个给你住掉了,那么现在就是lock,按lock配对,OK,进一个去一个lock,但这个你把它干掉了,那么我们来第一个问题,你们觉得这个程序现在还能不能正确运行好,那么同学们。跑一下。此时产生的问题。并没有报错。没有任何问题产生,好像很自然,像大自然一样自然,同一个线程进来了。进来了没问题啊,哎,那你到底讲的是不是有误呢?你别忘了。此时我们就一个线程。那么现在。
06:01
我们再来一个线程,假设我们的T2和我们之前的一样。洛,那么他呢?外层调用,此时这是我们的线程T2,好吗?那么来同一把锁,Lock UN lock lock unlo,和谐吧,Lock unlo t2的和谐吧,那么此时我们现在来跑一下。那么现在就是两个线程。T1进来,T1进来,T2进来,没问题。刚才我们演示只有一个T1的时候,我把这个注掉,好像并不影响程序的运行,那么现在你再试试。现在是不是第一把锁在T1这儿就没有lock,按lock完全匹配了。我故意把它。数量不匹配,不对等,加一减一不合适,那么这个时候大家请看一下T1还能不能运行,T2还能不能运行。
07:01
你T1。进来了,进来了,可是你少了一次示范,你计数器清零就写的不对,你T1吧,倒是跑了,可是我T2就尴尬了,我只好傻傻的在这儿。跟你等着锁产生了非常严重的阻塞,甚至是会导致死锁,所以说请同学们务必要注意这个可重入锁在这块是非常重要的。不为零的情况下,我们呢,进来了叫加一,如果说走了叫减一,为零了才代表所被释放,所以说尽量要保证我们显示的。调用主程的lock的时候,Lock和按洛尽量保证一一配对,这块绝对不能错,所以说在这儿我给大家呢写了注释,那么搁到这儿我们要明白第一种情况,那么请同学们注意,正常情况下加锁几次就要解锁几次来,否则的话我们呢。就会出现一个尴尬的局面。
08:01
由于加锁次数和释放次数不一样,第二个线程始终无法获到锁,导致一直在等待,那么刚才呢,我们也已经看到过,那么我们可以。清楚一定要什么洛克和安洛克匹配,否则T2就会一直等待好,那么各位同学,这个就是我们对可重入锁。影视和显示两种方法的介绍。
我来说两句