00:00
各位同学大家好,接下来我们开始正式进入这三个方法相关的源码分析和细节上的讲解来。我们大家都知道,通过前面的学习,我们最后强索都是acquire这个方法,但是在这个方法开始生效之前,它有三步也记这个这个这个。三个方法,那么这三条流程我们挨个挨个过,先走第一个分支,Try acquire,好,那么来吧。我们这次呢,反过来,以前呢是先看完老图的理论,再去看源码,现在我们直接源码分析,然后再来回过头来带大家进行理论上的总结和复习。那么开工。按照我们前面所给大家所设计的。ABC3个顾客A呢,先去占用了这个窗口,那么大家看啊,我们故意。暂停20分钟,相当于说他要占用这个资源是20分钟,那么对于我们的洛克。
01:00
按lo加锁解锁,那么在A没有解锁释放资源之前,那么B和C抢不到,只能进去排队,所以我们这么干。本次呢?按照我们的程序,我们呢以非公平锁啊,这儿是空的,那么走到这儿相当于说这个是非公平,这个是公平,它们呢底子呢都是C,那么C口这个我们前面介绍过,继承了HS,那么来对于非公平所的落克方法。有if else2个分支,对于公平所得洛克方法只有一个,那么就是AC块re,所以说说到底子,它们两个都一样,都是AC块方法,那么A块方法翻进去,那么就是我们的这个这个这个这三个方法好大体上过一遍,那么接下来。我们呢,以我们的非公平所为例,因为这个呢,多了一个分支,更复杂一些,我们把它讲明白了,后面这个你一看就会,一说就懂,来同学们。
02:02
首先啊,我们模拟。假设现在第一个线程A线程进来了,那么就是我们现在所说的这个资源没有人抢线程,有且仅有他一个,他是最先进来的,那么他看到了此时窗口空无一人,优先获得办理窗口的机会。阿里耶夫相当于说A线程。获得资源抢到锁,我们搁到这儿,现在呢。A线程使用了洛克方法。就是这儿。我来判断compare and set,那么一看这个名字啊,也晓得是什么,我们之前讲过的CAS啊,希望是零,如果说零就代表这个窗口空无一人,资源是空闲的,我可以去抢占,那么抢占了以后将它变为一,那么来先看一下这个方法。弟兄们,UN safe类什么之类的,我再解释了吧,那么相当于说他呢,干的活就是把我们的state这个状态修改为一,从原来的默认的零修改为一,代表这个资源有占用compare and swi int当前这个对象,这个状态的标识位从期望值的零修改为一,OK,好,那么。
03:19
这个方法完成以后,Set exclusive owner thread设置独占排它当前拥有线程的是谁?那么当前我们这个线程是不是就是,哎,总要有第一个线程抢占到这个窗口,抢占到这个资源,对吧?我们现在模拟一个银行办理业务的。案例,那么所以说到这儿它就设置这个,那么这个就是什么,我们当前的线程谁占到了就是A,那么大家请看源码,将其当前线程设置进来,所以说源码分析完成结合,我们这儿意思就是这样的。三个啊,我们这儿可以多个,随便你了,ABCDEFG,那么这个时候A线程。没啦。它呢,干一件什么事呢?跑到这儿请大家看这个时候是不是比较并设置我们的贝变成了谁,从零变成一,没有人占用,现在我来给他占用,占用了相当于说这个灯就从绿色的零变成了红色的一,代表有人使用并抢占这个资源。
04:22
银行受理业务的窗口,那么此时各位亲,那么就是我们的什么A顾客,也就是我们的A线程啊,我们这儿说的顾客线程都一回事,那么A相当于是在这加锁,按照我们的说法,大家请看,他呢要办理很长很长时间的业务,相当于说长期持有这个锁不放,那么后面的BCDEFG只能进队列,进去排队,OK,那么兄弟们搁到这儿了以后,我相信大家应该明白了,那么如果if完成,那么所以说他呢,就进到了我们这个窗口,抢占到了我们这个资源,这个就是A顾客,那么带就从原来的绿色零空闲变成了红色,一占有,A持有,第一步完成。
05:06
好,那么接下来。多线程高并发,A在这儿抢占,那么B第二个顾客是不是也就来了?他一看到受理窗口A被占用,只能去后客区等待进入AQS队列,等着A办理完成,什么叫A办理完成呢?相当于说这个A按lock释放锁了以后,我呢再去争抢,所以呢,注意这两个字叫什么,尝试去抢占受理窗口,那么这个B现在这个洛克他获得。不到,只能是什么,乖乖的去aqs队列里面排队好了,那么下面还是悉的配方,还是熟的味道。B过来了,要洛克方法,由于我们目本次是以非公平所为例,那么搁到这儿进来B第二个顾客洛克一比较我当然第二顾客也希望窗口没人,我可以直接去办,但是事与愿违,现在的期望值我希望是零实际。
06:05
然后呢是一,这个时候就导致这个一服进不来,所以第二个线成B,因为这块期望值不可能是零啊,A在这站着呢,对吧,现在的真实值是一跟你的期望落空,B只能进来排队过来AC块re,那么这个时候请大家看这个acquire和这个acquire干嘛都是同一个方法,那么来。大家请过一遍啊,这个是非公平所得acquire,我一点大家请看,就是我们的try acquire,那么搁到这儿了,以后大家请看,在这个非公平。所里面这个叫try acquire,其底子又掉这个非公平所try acquire,如果你是公平锁fire s呢?那么大家请看这儿就是try acquire,这两个是一个意思,但是如果你是公平的,那么过来这儿就是我们前面所说的多了这么一个检查前面有没有排队的这么一个方法,但如果你是非公平的呢,就没有这一个方法,它们两者的代码都是一样的,OK,好,那么这个是公平锁的版本,TRY块方法就多了这么一个,其他都一样。
07:14
O吗?那么来,所以说呢,我们本次非公平进来。和快二,哎,他要先看看这个的负二值来决定是不是往前推,好点开大家请看,又跳到了我们的aqs啊这个负类,这那么来吧。不支持的操作异常,所以说钱压回给子类钩子方法,那么现在我们要找的是非公平所得,那么过了这大家请看是不是从这其实。又跳回到了这儿,而这个非公平所又是它点看大家请看它和前面的公平缺少的是不是就是那个has那个方法,所以说这个非公屏障,那么过来现在就是B线程传过来的是一也想去加速占用好了,那么现在线程的当前线程是谁呀?Current就是第二个顾客线程B,那么线程b get c值是几?
08:08
现在的值是不是一啊,说明红灯亮起,窗口有人占用,那么C是一,一等于零吗?False,所以说我进来,那么再来l if,当前是b get,这个持有当前线程的是谁?是A一样吗?也不一样,那么大家请看这个就是现在占有线,占有这个窗口的线程是谁呀?是A,那么相当于说数字。它不一样,这个判断也不一样,所以说这个这个他们两个都没有办法进来,那么所以说B建成第二个顾客只能返回什么佛欧拉,那么现在。逐步回退,我们就会明白这个方法就返回false了,那么try acquire也就返回false。所以说对。第二个顾客B现场而言,我们呢,得到了这个返回的就是个什么false,那么false再取反,那么现在是不是继续往前走,所以来到了第二个方法,那么就是我们的A的维塔,相当于说非常抱歉,由于现在A占用了这个窗口,B你不得不进来排队,你这块。
09:24
尝试抢占窗口失败,失败就是force,整个force取反就是处处就往前走,OK,那么这个就是我们第二个顾客B尝试抢锁失败所进行的流程,失败了以后将会引出我们的。第二个方法,德维塔加入队列,好,那么对于第一步try AC块,它的作用和强索的流程就给大家呢,源码分析到这儿,咱们呢,小段小段的走,一步一步的来,细细的给大家讲清楚啊,因为源码分析比较费脑子,讲的太多,怕大家消化不掉,我们先暂告一段落来。
10:03
回到这理论,把刚才的串一遍,那么我们本次啊走的是非公平,当然公平和非公平我们都讲了,我们以非公平这个分支为例,回到这儿这个TRY块。这是公频的,这是非公频的,所以呢,我们选的是非公平所在re lock里面。Try acquire传射前所成功,是否不知底子是这个方法O了,那么所以说如果这个时候啊。我们来看它呢,出现这样的这个方法对吧?Get,那么如果是等于零,他马上上位,那么又把它从零改为一,那么相当于说他自己抢占成功,这个就是第二个可避,为什么呢?也许会有这样比较。幸运比较恰恰好的事情B刚刚要进队列。A又马上走了,所以说B呢,马上又续接成功,所以说是有这样可能,因为多线程高频发他说不清楚啊,所以说他每次就是是进队列还是抢到资源去窗口办业务,那么就看这个C。
11:07
如果是零,那么就把B收回去,当然如果不等于零,说明有人占用,我乖乖去排队对吧,那么好,所以说它这用带的状态和判断当前抢当前抢占资源的线程和当前持有线程这个资源是不是同一个,对吧?那么这个呢,我们呢,从。蓝两段都给大家说过,那么最后我们就主要他干了,返回true和false是这么一步,如果是副取反。OK,整体取反是错,那么就是往前推进。继续推进条件,走下一个方法,如果返回错,那么恭喜你前索成功,OK,那也就不用往后说了,那么现在你就去办业务,整个流程就结束,OK,好,TRY和快尔就给大家介绍到这儿,说的很清楚了,那么接下来看看如何入队我们的艾维这个方法。
我来说两句