00:00
好,同学们,我们继续接下来和大家解释一下,为什么它是doc内容当中最重要的基石。我们大家在使用guc的时候都会清楚啊,它给我们封装了很多通用巨爽的一些同步组件和工具类,比如说你看lunch。啊。这个呢,我认为你懂的啊,这个是拿来干什么的,那么我相信弟兄们呢都清楚,那比如说啊,我们再来你SIM信号量这个类好等等等等,不一而足,甚至我们的圆圈的落口。底子也是跟as有关系,那么我们来搂一眼,所以说你呢,如果只是API级别的层面的,会调用某些方法,你用的这么爽,那么底层原理是什么?来都是靠AQS的,再给你撑着。各位亲,走起,我们来看一下。
01:00
和AKS有关的包含但不限于,那么我就明说了,你能够顺利的使用这些类底子,都是AKS在给你默默的支撑着,哪有什么岁月静好全靠as给你默默支撑。来吧,兄弟们过来看。As框架,Lunch。老,老朋友,老熟人了,西。CCL barri re、读写等等等等,他们几乎都是靠框架,那么何以见得呢?不,我们先来看一下源码。首先,那么弟兄们啊,我们来露一眼,请看look这个源码来。找到上面的以后,它的入口程序。实现了锁的这么一个接口,但是内部大家请看啊。SYNC这么一个C口,这一个变量,而这动不动又来自于哪呢?大家请看。
02:01
抽象的静态的内部内叫声它诶。继承自我们的AQS啊,所以说你在外面啊,操作这个re lock的这些API lock lock,其实design,人家调用的是这么一个C口的这么一个类,而这个类又是aqs的子类,前面是不是说过叫抽象的队列同步器。所以说人家给你做的这一套是管生又管养,管杀又管埋。非常爽,这个思想请一定坚持学下来,那么来,那么由于啊,反复的切换这个代码,我们呢,就给大家呢,把源码抓图好,我就不再打开其他的类了啊,意思就是说这些类我就不再打开,那么首先我们可以看出re lock。来吧。靠他继承了这个。然后底子,大家请看抽象的look方法说明什么底子就靠你去实现,把那些规矩全部放在抽象类里面,给父类封装好。那么大家是不是都是。
03:08
同一个思想,同一块架构,好,那么再来看lunch看一眼。这个类底design大家请看,还是SYNCC口这个类又继承了aqs。好,再来看读写锁,表面是这么看,对外暴露的使用API接口,而底子还是aqs,那么再来SIM,这个底子还是它够了吧。我相信看到这儿大家应该明白这张图,所以说我们要清楚啊。你在最外层用工具用的时调API调的顺,其实都是aqs做支撑,所以需要大家在理论篇要明白所和同不起的关系,不然我一上来啊,我就给你讲励一大堆枯燥乏味的源代码,你听完以后你没有任何收获,你也不知道为什么要分析这段语源码,所以说我们现在要理解所和同步器的关系,别忘了人家的名字啊,叫抽象的队列,Sizer,不是一。
04:11
不是E和D,这个英语是ER,是同步器的意思,那么为什么呢?来首先。锁是面向程序员,面向锁的使用者,就说我如果用很简单lock啊lock我就完了,那凭什么底层这么牛逼啊,那么所以说我们要明白。最粗浅的就是会用定义的程序员和这个lock lock方法交互使用的API,它隐藏了实现的细节,你调用就行了,反正用之前洛克就跟进个卫生间一样进去,洛克用完了啊洛克,可为什么要有同步器呢?那么回到我们这个。大家。在这儿还有很多等着的,你不能说一加锁一加了之啊,那后面这些呢,你如果用完了,我应该安排谁去呢?是真钱还是循环,还是等待这个唤醒通知的机制啊,怎么个套路来进行安排,所以说这个同步器是面向所的什么者,实现者就是大神,他们会觉得。
05:18
有这么多类底子都是aqs啊,那么现在都要涉及到锁的竞争和调度,所以说。我们干这么一件事。并发大神道个立,他提出统一规范并简化了所的什么实现,将其注意抽象出来,屏蔽了同步的状态管理。同步队列的管理和维护,阻塞队列的排队等待、通知、唤醒机制等等是一切所和同步组件实现了什么?公共基础部分为什么要叫抽象?那么现在有这么多类,哪个?出队列了,哪个县城要去抢索了,这个我完成以后应该通知下一个,大家都有这样的需求,好,我们大神过来一统江湖,一统天下,那么既然大家都有这样的要求,都需要处理这样的问题,我就制定出一套统一的规范给你屏蔽这些细节,那么也就是我们在这儿的阻塞排队通知,唤行同队列的管理维护等等等等,将其做成被此抽象积累。
06:25
继承以后形成公共基础部分共同来维护这样的代码,所以说一个是使用者,比如说像杨哥这样的菜鸟,对吧,我就是会用用,那么大神的考虑的问题是如何实现者,OK,好,那么这个就是为什么说。Aqs是GC内容当中最重要的基石,那么来接下来我们来看一下,那么它能干些什么呢?首先我们都会清楚加锁会导致阻塞没问题吧。那么。一个线程在里面用。有可能它是一秒钟,有可能五秒,有可能一分钟,比如说这个资源非常占,这个窗口占的时间很长,那么源源不断的请求过来了,为了保证不被冲垮,我们会要有一个明白。
07:13
抢了锁的线程就会占用资源,别的线程也要调用,那么只能是排队,形成了阻塞,那么有阻塞不能乱,需要有人管理起来,通知、唤醒、等待,甚至是取消,那么有阻塞就需要排队,我可以排着,排着哪个。下一位是谁,哪一个不想排了,需要取消出队,入队出队,谁去接下来就抢到这把锁去使用,所以说这一系列规范就AQS给你拿捏住啊。那么。有阻塞就需要排队,实现排队必然就需要队列。所以呢,我们来看一下走。抢到资源的线程直接使用处理业务,好比一个银行某个窗,这个银行今天周末窗口少,就一个在办理业务,这个顾客就是一个线程,我抢到了,这个状态从绿色的零变成红色的一,说明有一个人在办理业务,我们后面的线程来了,只能乖乖的等待入队。
08:14
抢不到的资源必然涉及一种什么排队等候机制啊,那么刚才讲过了是吗?是不是就是等候区,候客区,那么抢占资源失败的线程继续去等待,类似于我们的银行业务窗口等满了么?暂时没有受理窗口的顾客只能去贺客区排队等候,那么当然你等候的县程仍然保留获取所的权利和可能,那么大家都清楚啊。这个顾客离开窗口走了,相当于这个县城示范资源按落了,那么等候区里面的这些是不是应该按照一种规矩先来后到啊,比如说我们在生活当中,那么接着下一个去办理业务,所以说呢,这个时候我们呢,在队列里面的等候线程也有获取所得机会和权利,他们仍在继续等待。那么候客区的顾客,比如说也在银行里面等着叫号,轮到了再去受理窗口办理业务,那么说到这个排队等候机制,那么就一定会有形成某种队列,对吧?大家都要排队排队排队,人多了都要排队排队排队,既然是排队就是队列,那么这种队列什么数据结构呢?就是我们的aqs。那么来。
09:17
这个窗口。共享资源办理业务的银行窗口被占用了,就需要一定的阻塞等待唤醒机制来保证什么所分派你现在群雄逐鹿,不能说大家打一下。争抢吧,所以说这个机制就是要有C队列的是吗?变体实现刚才我们看见了啊,源码部分我们都清楚,呃,它呢是。你把它理解为是一个单链表,但是呢,实际而言,我们在变种改体了一下,是双向的,将暂时获不到锁的线程加到这个队列当中啊,这个队列就是aqs的同步队列的什么抽象表现?他将要请求的共享资源和线程的自身等待状态。
10:01
结合成一个队列的节点叫node对象。有点类似于我们的哈希麦,这是一种数据结构,你装在哈希里面以建队,那么TV建队也封装进一个node里面。而这个as里面每一个来办理业务的线程顾客也封装进这个noe里面,放到这个队列,你可以把它理解为这个node,对啊,就是银行后客区里面的一把把椅子啊,这个椅子上面就坐着一个个顾客,就是我们每一个请求线程的OK,那么通过CSR、子璇以及support park等方式维护这个什么C变量的状态,使并发达到同步的效果,那么相当于说有一个人用着这个资源呢O。卸下来的用不到啊,那怎么办,坐在椅子上,这个椅子啊,就是这个no这个对象,然后这个里面封装了,就是来办理业务的一个个thread线程,然后大家形成个队列,按照头。为双向指针决定哪个线程被唤醒,哪个线程下一个继续去办理,甚至某些线程说我不办了,等的人太多了,我要出兑,我要取消,我走了都可以,所以说这套管理机制啊,所的分配机制啊,就是我们的aqs。
11:12
好,那么这非常重要,请大家务必理解。
我来说两句