00:00
同学们,我们继续完成了第一个洛方法的讲解以后,我们现在的状况是B准备过来了啊,假设这个就是B。我们的。他过去看,抱歉。受理窗口是不是被A占用着,这个灯是红色,进不进去,那么现在抢占失败,他是不是要准备进去排队了?好,我们到这儿了,以后我们继续往下走,回到上一步。那么现在A已经占用了窗口,B走不进这个if,只能走这个else,那么现在B第二个线程进来acquire,然后到这儿了。以后一。233个方法,我们现在看第一个try acquire,那么它这儿呢干嘛。船的参数是几?同学们千万不要混了啊,船的参数是一,代表占用一个,那么过来TRY块尝试着抢占,B也想试试嘛,他要去办理业务。
01:01
进来。哎呀,大家请看,这种情况下你怎么看源码。来这个是不是我们aqs啊,这个叫TRY块这个方法,但是它里面的业务逻辑代码一行都没有,直接给你抛个异常,这就是典型的设计模式,里面的模板方法,设计模式啊,我告诉你所有此类,你必须给我实现这个方法,你要敢不实现,我负类就不高兴,马上给你报个异常,逼着你必须实现,这就是把。规范统一的往这个模板上面去放,定义的足够高,但是落地的实现放到子类,落地的足够低,而且有抛出异常来限制,你必须给我实现底层的钩子程序,OK,好,那么同学们。打开这,我们来看我们现在是选的是哪个,你看说明说明什么,有四个类。实现了这个方法,那么我们现在找的是re en look里面的这个非公平锁,OK,第二个进来请大家看这个方法其实又调的是非公平锁的try acquire这个方法,那么我们走起好,这个是我们的是吗?非公平所的try acquire,那么这传的参数是一过来threat.current,那么现在这个current是谁?就是我们的线程BK。
02:17
走起,我们接下来。c.get那么这是一个。英特型的get什么意思啊,是不是就是对这个的值进行一个获得,那么如图所示啊,我们的是几是一一说明已经有线程在占用好,那么回到这儿。现在我们这个C是几,是一等不等于,零不等于,那么继续往下走,看看当前线程从get exclusive thread和。目前坐在受理窗口上,这个线程是不是同一个,那么同学们都清楚啊,当前线程是几是B,现在坐在受理窗口上办理着业务的持有所得,这个现象是A是A,那么B等于A吗?不等于,这块也是false,那么这块是false了以后两个都不进来,返回什么,返回一个false没办法,那么所以说这个时候,那么同学们就可以看得出我们进来了。
03:17
一号整体这个B线程,这返回的是什么?是一个false false在取反了以后是什么是错,所以说呢,我们呢,还要继续往前走,这个就是我们的第二个线程B线程,它所要面对的情况,好我们再进去这个方法再给他。说一些其他的东西,那么好,同学们请看。这一段。这段是什么意思呢?现在假设啊,有一种可能就是比较运气好A。办了这业务,B也就来了,正准备进去的时候。
04:02
A刚刚也办完了,马上就走了,B也就抢到了,有没有这种可能,有那么这个时候请看这个衣服,这样意思啊,B准备去抢的时候,他现在看一下。正常情况下。没有那么好的运气A可能还占用这个值是一,但是我们说的是一种极端运气好的情况B。刚刚要进去,A刚刚走了,那么这个值是不是就是从一又变成零,没有人占用释放了,所以说这个时候就如果是C等于零的话,那太爽了,那么我这个B运气比较好,我。前脚进去,后脚A就离开,把这个座让开了,那么我B希望没有人占用。刚刚好A。下一秒就走了,诶刚刚好,那么这个时候我就把它设置成当前的,占用这个窗口的是谁,是B,听到跟刚才业务逻辑一样,如果这儿返回错,那么你懂的,我们前面那段代码取反了以后,就是false不再往前走了,OK,这是一种情况,那么下面这种情况什么意思呢?
05:09
如果当前的这个线程还等于持有这个线程,那么C加acquire什么意思啊,也就是说还有另外一种极端情况,就是可能这个A啊。离开了以后,又是这个A强盗什么意思呢?比如说这个A在这儿办理着业务,B在这儿等着呢,A呢,刚刚好屁股抬起来了以后,要准备走了,B也觉得说诶要准备走了,但是突然A又说又坐回来说哎,等等等,我再办理一个业务,我去,那么这个时候你懂的,B是不是又只能等着,那么这种情况就是。刚好得到总判断说明什么?当前线程假设是A。目前占用的这个线程也是A,那么这个时候说明什么?A占用了两次,那么是不是原有的这个一再加一个传进过来的1NEXT就是几?2S是几,也有可能是二,那么这个是不是就是我们前面所讲的可重入锁呀?
06:05
这一波OK吗?好,同学们,那么这个时候一定要注意这返回错和这返回false。到底返回什么,前面是有一个结果集是取反的,根据刚才我们讲的业务正常流程走下来,B抢不到,因为我们这儿A还在正常的办理着业务,B挤不进去,挤不进去以后这个怎么着是first整体取反怎么着,就是处处的话是不是继续往前搞。那么往前拱的话,是不是要轮到我们的第二个方法,哎,维塔,那么大家请看维塔是不是等待的意思,说明这个B是不是就要慢慢的入队了,去等候区,OK。那接下来我们再看看,回到我们的正轨啊,刚才说了一些分支流程,那么现在拉回来。回到我们的主要的,那么现在请大家看这个B没有抢到锁,受理窗口有A在站着呢,我只能去等待,那么走起,我们是不是要看看这个A这个方法了,注意丢进去一个什么node.exclusive排它的,我们说过这个node它是aqs的一个内部类,这个node里面是不是就有一些属性共享的,排他的,独占的,还有一些状态,最主要的是不是就是这个这个这个这个这四个变量说过吧,那么再次强调。
07:30
No的内部类里面封装的就是一个一个的客户线程,OK,好,那么同学们。我们呢,回归到这儿,走到我们的艾德进来。那么请看,此时我们就要对这个艾德维塔这个方法进行详细的讲解,此时才代表B线程正式的入队。
我来说两句