00:01
各位同学大家好,刚才呢给大家解释了什么叫公平锁,什么叫非公平锁,那下面呢,给各位再来说明另外一种锁,这个锁它叫做可重入锁,给大家写一下。可重入锁这个锁呢,其实咱们之前是用过的,下面呢给大家做一个详细说明,说一下里边这个可重入锁到底是什么意思,那这里边给各位来解释一下,我在图上,那我们来说一下可重入锁。那什么意思,大家看啊,可就是可以吗?重入就是可以再次进入锁,就是咱说的重步区域,这个叫可重锁,那咱们之前学那个的,包括咱们里边用的这个look都是可重锁。就是这两个诠释可中索特点,而这两个区别是什么呢?S,你可以理解为是一个叫隐式的这么一种叫做可充锁,另外咱们说这个就是look是一个显示的可充锁,那我来写一下啊,这个是隐示的,然后lock是这个显示的。
01:17
那什么意思呢?比如说咱们之前解释过SNE的上锁解锁是不是它自动完成的,而lock咱是不是需要手动上锁和解锁,所以这是隐示的,这是显示的,而什么叫可充锁呢?给大家画个图,我来说明一下啊,首先比如咱画个图。比如大家看啊,假如现在呢,这个是有块区域,然后这块区域中呢,咱要对它进行锁操作,就要加锁,加锁的话都要它那个管程对象在它进入里边加锁,然后出去之后解锁,这是一个最简单的,比如现在我们这里边有这么一个场景,我们从它可以进入,最终是不是可以出来,这是我们最简单的枷锁和解锁,那这个时候各位注意啊,在我这块去里边,比如说我有第二层。
02:10
比如说咱们还有第三层,那按照可出入锁什么特点呢?我这锁能进入第一层,能进入第二层,能进入第三层,它可以实现自由进出的过程,这就叫做可重入锁。这个过程呢,给大家举一个比较现实点的例子啊,比如说各位啊,你回到你的家中,咱们一般来讲,我们的家是不是有一道大门啊,我大门要上锁,当我把大门的锁打开之后,我再进入家的其他屋子,不需要再打开锁,比如说我进入到卧室,进入到厕锁,不需要再开锁了,我只需要把我大门的锁打开,然后我家的其他的房间是不是可以自由出入,自由进入,这就叫做可重入错,所以各位得知道有这张图上画的,咱们第一个加错,然后里边包括有很多层,那我这里边可以自由进入。
03:06
里边的所有区域,这就叫做可充锁,也说的通俗点,他们目前用的其实是同一把锁,通过同一把锁能记入里边的各个区域,这是我们提到的可充锁,那我下面呢,把这个过程咱们通过代码方式给大家演示一下,而可充锁其实还有一个说法,它也可以叫做。递归索,那下面啊,我来说明一下,咱们分别用sight的关键字,包括lock方式,分别演示可重索的相关特点,那下面给各位写一下。首先我在这里边呢,写好了一个类,然后在类里边呢,我加上一个嫩方法,咱们首先将这个S的关键字先演示一下可出入所这个特点。我来写一下它这个代码啊,首先比如说我先创建一个,咱就来一个object对象了,等于new上一个object,然后在里边呢,我给它加上这么一个线程,咱们就是上这么一个。
04:14
Threat,然后在里边直接咱就输出当前这个现成的名称,我做输出th.current threat.get name,然后这里边比如加上一个提示啊,比如这是我们那个最外层的这个操作。这是我们提到的啊,然后在过程中咱是不是要加索要,那我加上一个S的关键字,在里边锁上咱们刚才new这个object这个对象,然后在里边我们做这么一个输出,这个位置加上咱们的线程名称,比如说我叫T1。再点上一个start,所以大家看这就是一段最基本的代码,咱们这里边加锁,而它进入投入加锁出来之后肯定要解锁,现在比如说我做个输出,那里边肯定是一个最简单一句话,就是我们这个线程加上这个外层,所以现在啊,这是一种最简单的实现,而现在呢,我们在里边给它加上一个,就是咱说那个可重复锁,那怎么做呢?大家注意啊,比如现在我这么做。
05:22
我在S里边呢,再加上一层O。然后这位置我也是做一个输出,就把这句话我再输出一次,然后这里边给它改个名字,比如我们叫这个中层,然后洗完之后,我在这个散袋子中再加上一层,然后这个咱们叫做内层。所以大家看啊,这个过程是不是就是我刚才画的图上这个效果呀,那咱通过这里边的效果中,我可以自由进入里边的所有区域,这就是一种最简单的可充锁,咱通过s net这个同步代码块,然后里边锁定你的对象,这是最外层,这是中间层,这是最内层,那现在我把它执行下,各位看一下这个效果,你看啊,外层中层内层是不是都输出了,这就叫做可冲锁,你可以自由进入里面这些区域。
06:21
所以各位把这个知道,然后这个说完之后,下面呢,咱来演示s net中的另外一个特点,因为咱们写的是一个同步代码块,咱是不是能写一个同步的方法呀,那我现在在里边呢,我就加上一个同步的方法。我来写一下啊。就是site里边这个同步的方法,那咱们来一个public site啊,比如我叫we,我就叫A了,然后在A中呢,比如说啊,我这么来测试,我再去调用A的方法,大家看是不是自己调,自己循环调用了,那这个时候最终我在main方法中,比如我做个执行,那就直接啊谬上这个对象,点上A的方法。
07:07
大家看这特点啊,我强调。这个特点我想演示什么呢?咱刚才说的可重入锁也叫什么,是不是递归锁呀,我这么做是不是就是一个递归调用啊,那比如现在我把它执行一下,咱们看一下里边这个特点,比如现在我做一个执行。然后各位看啊,这里边是不是就抛出一个,各位都知道这个是不是这个占一出异常,那为什么有异常呢?位注意啊,就是咱说的可充锁,如果说我现在用到的不是可充锁,那我这个方法掉的时候是不是要加锁呀,它加锁之后别的方法是不是就不能调啊,但是我现在因为是可充入锁,你可以自由进入,所以它就实现出一个循环递归调用。这一过程各位要知道啊,如果说它不是可充入锁,那我这个方法肯定调不到,但是因为它是可充入锁,用的是一把锁,所以我现在就可以做到一个循环D位调用,最终出现了这么一个占一出异常,所以证明我们这个这个nice的关键字。
08:16
这个上的锁就是一个可重入锁,咱们通过两个场景,一个是SNE同步代码块,一个是它的同步方法,把这个给各位做了一个演示,所以你把这个特点知道,而S奈它的声明是一个隐示锁,因为它上锁解锁过程是不是都是自动完成的,不需要我们去做相关的操作,所以这个我们就完成了。然后完成之后呢,下面呢,给大家再演示一下这个lock的切口操作,咱们通过lo也是验一个就是可出入锁特点,其实过程跟这个应该是类似的,那咱们马上来做这么一个演示。
我来说两句