00:01
各位同学大家好,下面呢我们继续来演示可出入锁,刚才呢,咱们说明了可出入锁的特点,也就是我现在打开地道大门进入,然后里边的其他门可以实现一个无障碍的进入。可出入锁又叫做递归锁,刚才咱们通过ne的关键字,通过它的同步代码块,包括同步方法演示出了可重入锁的相关特点,那下面呢,咱再通过这个lock接口,用显示的方式再给各位演示一下可充入锁显示方式,意思就是它需要咱们手动上锁和解锁,那下面给各位同学我来说明一下。在这里边我现在来写一下,比如说我先加个注释,咱用lock来演示,这个叫可重入锁,那怎么做我来说明一下啊,首先难的第一步肯定是先扭上一个lock对象。
01:01
咱们就扭上一个re en local,这个咱们刚才说到过。默认它用的是不是叫非公平索要,咱们改变它的直角处,变成是不是就是公平所特点,所以我们现在直接扭一下,咱们做个测试就可以了。这是咱们的第一步,然后这个做完之后,下面呢,咱就可以创建我们的线程,那我们来创建new上一个thread,然后在里边加上一个拉姆的表达式,在拉的表达式里边,我们加上这个锁的过程,我现在啊,比如说给它线成起个名字,咱们叫T。点上一个撒的方法,然后在里边我们现在先加上一个那个try final的这么一个结构。把它先加上。然后加上之后,在TRY里边呢,首先我们先做一个上锁的操作,然后在final里再做一个叫做释放锁或者说解锁操作,那我们来做一下啊,咱们用lock.lo先上锁,然后我们再用点unlo做个解锁,在这里边我们直接把当前的线程名称咱们就输出一下啊,比如说我加个名字,这是我们那个就是最外层的这么一个操作。
02:23
这是第一部分,然后洗完之后,因为咱们目前是一个多层的情况,所以我在这里边呢,我再加上第二层这层这里边比如我就叫做。内层操作,现在这个基本代码就完成了,按照咱的逻辑,我进入第一个这个上锁已经进入之后,然后这里边可以直接无障碍的操作,那下面咱们把代码执行一下,我们看一下效果是怎么样的。大家看效果是正常执行了,所以现在啊,咱就通过这个lock接口,把这个可重入锁的过程给各位做了这么一个演示。
03:02
测演示之后呢,咱们目前呢,是一个正常的情况,那我下面为了各位正好理解这个代码,把它改个地方,大家注意啊,我改成地方的这一行带什么呀,这一行干什么呀,各位都知道这是上锁,这是不是解锁,比如现在我把这个解锁干什么给它住掉。你注意啊,这里边我只上锁了,没有解锁吧,那大家考虑一下,你说目前我们这个程序能正常执行吗?是否可以。那咱们来试一下啊,看一下它会怎么样。大家看啊,会议执行是不是正确了,为什么正确?大家可以想一下这是为什么。按照我刚才说的过程啊,因为咱们目前是不是同一把锁,我第一道大门进入里边的门是不是可以实现一个无障碍进入,所以这里边你不释放,他自己也可以正常执行,但是这么写呢,肯定是不对的,它是有问题的,正确肯定是上锁解锁,上锁解锁,但是目前我不解锁,或者说我不释放,锁里边肯定会产生问题。
04:10
那什么问题呢,给大家来说一下啊,比如说我现在啊,我在这里边。我再来创建一个新的一个线程。那咱看他会怎么样啊,我上一个thread。然后在里边我给它也是上锁和解锁啊,咱就直接写了,正常应该写那个串三个里边我就直接上锁和解锁了,然后在中间加一个输出,就来一个AA,这里边加上一个线程的名称,调用S的方法,然后现在你看是不是一个新的线程也是上锁和解锁,现在我把代码执行一下,大家看它什么效果。看到问题所在了吧,什么问题?第一个这个没有执行吧,但我程序目前是没有结束,为什么这样。
05:03
大家说为什么这样,你看啊,我现在这里边是不是要进行上锁呀,但是我上面代码中锁没有释放吧,所以我这里边就得不到你这把锁,它后面就不知情,他要等待你释放之后,得到之后才能往下进行操作,也就是说到通俗点啊,你自己操作不释放无所谓,但是你把别人坑了,别人就不能往下进行了,所以大家注意啊,我们写代码中一定要有上锁有解锁,有上锁有解锁,要不然你代码执行过程中就会产生问题,比如这里边就造成你的程序那就效率极低,因为上面没有释放,下面就永远得不到你这把锁了。所以现在啊,咱们通过漏方式把这个可重入锁给各位也都是演示,也要各位记住啊,就是可除入锁又叫递归锁,你进入到第道大门里边的门可以实现无障碍进入,而四个nice子的包括lock都是可出入锁,只是一个是隐示的,一个是显示的,这个过程给各位完成了一个显这么一个演示,所以大家把可容锁的特点给它记住。
我来说两句