00:00
各位同学大家好,截止到目前为止啊,我们终于完成了as源码的深度分析和理论的介绍,那么通过我们之前这样的案例啊,类似于动画片一样的,一步一步的,我带着大家呢,完成了从强索到入队到出队,到等待唤醒通知,再到取消出兑等等。那么主流的流程带大家呢过了一遍,那么相信大家对AQS的这三个方法,它到底干了一些什么事,以及AQS的出入,对lock按lock底造到底是什么样一种情况,也会明白为什么AQS的使guc高频发变成的重要基石,那么截止到目前为止,从理论到我们的实操圆码分析讲解完成那么好三板斧最终是不是我们还有?全系列的脑图带着大家呢做一下笔记。那么多讲。抡下来吃了这么多苦,受了这么多罪,也都是为了提升答案内功。那么接下来。
01:04
三大主要流程,这个这个这个。三个方法都给大家详细的调试过,那么接下来串讲一下,给大家看看到底我们的源码分析讲了些什么,OK,走起,那么我们呢,将会走到我们的这张图,那么这张图呢,请同学们看一下那。这也是杨哥精心为大家准备的。那么缩小一点,我们按照三块一。二三将aqs啊,我们讲过的源码分析从头到尾主要流程带大家进行分析和串讲一遍,那么大家请看一下啊,你不要想着就是一遍你就能够听得懂,那么我做了多少笔记,我翻查了多少遍,那么从我们的圆圈look look方法开始,一直到一。二对吧,每一个主要的都是我们讲过的,最后三怎么出队入队,一步一步带大家进行详细的讲解和分析,OK,好的,那么接下来。
02:08
也和同学们再多说一句,首先啊,As的源码分析。有很多内容,那么限于我们的课时,我们没必要也不可能全部的方法带着大家分析个透,翻个底朝天,但是呢,主流的重要的内容我们相信呢,已经给大家呢介绍完成,至少能跟到这儿的同学,我认为aqs在你脑海里面,只要你是认真跟着杨哥的源码分析走上的,应该呢,不会说是一点儿都没入门对吧,那么所以说。讲过的希望大家呢下去呢,跟着我们的,甚至是第八个断点,跟着我们的视频,大家再复习一下,没讲过的,那么也请大家以我们讲过的为基础,进一步的深入和挖掘,OK,好,那么感谢大家的聆听,那么接下来我们来进行相关的串讲,来看看主要流程我们讲了哪些内容。
03:01
走起。我们大家呢都清楚啊,实质上而言就是三个方法,那么所谓的三个方法也就是尝试抢得到,直接使用抢不到,我入队,入队的过程当中我有尝试。按照我们。队列的规则,等待唤醒通知,是继续等办理业务,还是可以出兑、中断、取消等等等等,大致就这么个意思。所以说。整个原车的lock,它的加锁过程洛按洛克,那么从lock克这块分为三个阶段,第一个尝试加锁,第二个加锁失败线程就要进入队列去等待,对吧?银行的后客区进入队列以后等待着通知进入到了阻塞状态,那么如果你要有印象,马上应该想起洛support.park on park,对吧?那么所以说对应着我们的1233部分。来。我就不再反复切换,这些都是我从源码里面扒下来的,那么同学们搂一眼,我们以lock为例。
04:05
这个lock do要暴露的API叫洛方法,我们调用很简单,就1LOCK按洛可大家都清楚,主要是用S这个类的。Lock方法,而C口这个类继承了抽象的队列同步器,那它就是我们的基时根基,相当于这个是用原车的lock对外暴露的一个接口API,而底噪是用C口,那么C的lock方法,那么大家呢,继续往下走,前面讲解过这些东挨个挨个的过过。在他think口的look方法实质而言是个抽象的look方法,那么凡抽象的就是一种规范,一种体系,一种接口,有底噪去落地实现,那么根据我们的园区的落考船的参数,可以分成公平锁和非公平锁,对吧?那么这个呢,大家呢都清楚啊,那么对于我们而言,大家可以看得出。
05:00
公平锁走左边,非公平锁走右边,那得到的结论是什么代价呢?对于公平锁而言,你对应的lock方法,实质而言调用的是acquire,这个方法我们强调过零跟一对吧,默认现在零就是假设啊,最简单的理解,这个窗口没有人占用,是绿色的,State是零,绿色的空闲状态一的话,红色的一有个人在抢着,对吧,在使用着,那么这个是我们的公平锁,那这边呢,是非公平,所公平和非公平,其区别我们以它这个分值作为主流,因为它多了一步,比这个复杂一点,其实质而言底。那么如果compare and set从零到一设置成功,那么当前占用窗口呢?还记不记得原来我们说过第一个程就是A线程,否则AC,也就是说。如果强所这个过程当中,说到底公平和非公平干嘛,它都汇总到我们的什么acquire。
06:00
这个方法没问题吧,那么对于在这儿就是CAS啊,成功了获得所设置所持有线程为当前线程并返回,那么大部分情况下只能有一个抢到,那么不成功的呢,就要走我们的acquire方法,那么结合我们的源代码就会清楚acquire就是三部曲,Try AC块re和acquire q,那么这三个那又是怎么来的呢?我们就这么一步步抠出来,一点点讲下来的来吧,AC块re方法尝试获取锁,如果获取不到,排队阻塞当前线程,OK,啥意思呢?我们都强调过这个TRY课二,如果抢得到,它返回的是处,那么true取反是false结束就不会往前走,但是大部分抢不到false false取法就是处处往前走,艾塔,艾塔完了以后再acquire q好,所以说我们这第一个方法try acquire登场,那么如果抢到了好说抢不到,那么我们走艾德维塔。所以说我们先来看第一部分,那左边这个分支大家请看。
07:05
这部分的所有逻辑都是TRY块方法调用引申出来的,TRY块方法顾名思义就是尝试获取一次锁,抢不抢得到,抢得到最好,抢不到过来排队,所以说呢,同学们在这一块这个代码都见过吧,那么注释呢,我就不再照本宣科,我们按照代码粗略的过一遍,因为这个在前面已经挨个挨个的都给大家讲过,那么说过所已经被其他线程,假设现在当前线程啊是A线程或者是B线程,C线程都要走这么一个判断零,那么最好对不对,没有这个人抢占,大部分情况下都是啊,那么所以说它分三种情况,缩已经被其他线程获取。所没有被其他线程获取,但当前线程需要排队,第三个CS失败可能过程中已经有其他线程拿到锁等等等等,那么根据这的判断。如果说锁的自由状态啊,C等于零,并不。
08:03
能说明就是立刻执行CS获取锁,但是大规模的情况下啊,那么注意他这儿是不是有个孩子,就是排队的前面有没有预告,我们这儿前面强调过。
我来说两句