00:01
通过前面的介绍,我们对aqs的理论知识有个大概的了解,别着急啊,我说过了,杨哥三板斧理论实操小总结,一定知识要是体系和全面。这些理论初步听你会觉得有点无聊和枯燥,但是待会儿我们带你开始解读A的源码的时候,到最后大家做总结的时候,你相信我前面这些没有一句话是废话。刚刚开始学,不要浮躁,不要觉得老师啰嗦,不要觉得这些理论你不想听了,面试的时候是需要谈这些东西的。OK,走起,下面我们来看一下AKS初步,然后再是源码的深度解析。来吧,首先AKS的官网解释来自于哪呢?那么。我这儿还是给大家先说一下这个出处啊,就是它上面这些啊,理论呢,这些我呢都给着大家呢,你看这是不是个fio的等待队列都给大家呢摘出来了,我们呢。
01:03
走起。首先啊,他。提供了一种框架,对于你看为了实现阻塞所和相关同步器提供的一个框架,你看它内部的定义,对AQ这个类是一个framework,一种框架,是不是就是一种基础基础架构?OK,它是依赖于先进先出的一个等待,那么this state依靠单个原子int的值来表示状态。零就是没有人占用。一就是被占用,那么通过它来模拟占用和释放的两种状态,通过改变状态值来获得,OK,这是官网上的一个最准确的说法。那接下来。就是我刚才这句话。你要有阻塞就要有排队,排起队了就是这些,所谓排队就是抢不到锁的这些线程,就要需要一个队列。那么排队的。县城越来越多,你是不是需要纳入一种良好的管理,那么这种管理的模式走起?
02:05
Aqs呢,就使用一个vlatile的,然后我们去看源码啊的类型的全员变量来表示同步状态。有没有被占用,通过内置的这个队列来完成资源的获取的排队工作,将每个要去抢占资源的线程封装成一个什么node节点来实现所的分配。通过CS自学。完成对state值的修改。那么来同学们看看源码。在这块啊。抢占资源的线程封装成一个node节点来实现所得分配。那么在这儿我们先看源码,后说理论总结,这是我们的抽象类abstract,在这么一个类里面,它有一个成员变量叫no。OK,这个。Node就是以后我们形成AQS队列里面所装载的一个一个对象,是一个一个的node装到这个。
03:03
As里面第二个是不是说过一个叫int类型的state,大家看,使用一个vlaile的in特类型的成员变量来表示同步状态,那么好。我们这儿。先按照我们懂的来说,我们来对比着来学习。我们以前是不是学过一个东西叫哈希map,我们都清楚哈希迈普是不是主要就是。TV键值,对呀,我现在问一下大家,如果我现在写一个map.put比如说一这个值是A。那么是不是直接就把这个K这个建制队放到我们这个map里面了。大家思考一下这个问题,可能会说是啊,有些同学可能会说不是啊,正确答案呢,严谨的说是不是的,为什么map里面它不是放TV建制,对。严谨的话来来说的话,它是放的是一个什么no的节点,这个节点里面是一个T一个V,听懂,也就是说我们丢进去的TV这个值啊,其实而言是被封装成一个note节点,这个note节点再扔到我们的哈map。
04:15
那不相信的同学,或者有疑问的同学,我们可以来最经典的,我们来实现一个。哈希迈普这一波。同学们都没有任何问题吧,我们就说哈希map的put方法,我们先找一个哈希map,这一波没问题吧,那么好。大家看哈,Map里面是不是有个静态的,你看这个是不是叫哈希map,哈希map里面是不是有个静态的内部类叫node。走起,这是不是有KVI,那也就是我们的K跟V,表面上是put,是扔到map里面,实质而言,我们都清楚put底层调的是put value,这个方法怎么着?我们是不是原来在基础篇就讲过所谓的哈,Map是一个什么数组加链表加红黑数的结构,所谓的数组是什么类型的数组,是一个以KV键值对。
05:02
作为载体,作为媒介的一个no类型的速度。那么。我们在这儿。也说过这句话,这个呢,是我们的什么abstract是吗?抽象的队列同步器。那么。一样,我们在哈希map里面,我们丢的是TV键值,对,我们在抽象的队列同步器里面,我们丢的是什么?是不是我们的一个一个的thread线程,那么就跟这么一样,我传进去的是TV建制,对,是不是这个TV建制,TV就直接给map不是多了一道手续,被封装成漏的节点,那么一样,我们的abstract它呢,管的是什么?管的是一个一个的没有抢到所的线程,那么是不是直接把我们的这个。线程也扔到这个抽象队列同步器里面呢,没有,它也多了一道手续,而这道手续也是我们的什么东东,No的节点,只不过这个时候你可以把它理解为这个no的节点,现在它扔进去的是一个一个的线程,相当于我们要把这个线程做一次载体的封装,让no作为一个承接的载体放到队列里面,所以呢,我们来看一下这个相当于我们的。
06:14
最外层的那个map,也就是我们现在这儿的是吗?Abstract抽象内看,这个是它的构造方法,请看这个里面是不是就有一个node类型的内部类呀,所以说abstract里面它装的是什么?装的就是一个一个的node,好,这是第一步啊,第二个我们再看这是不是有个state。来。直接的告诉你了,这是同步的状态V,那么可见性保证可以保满足in特类型默认值是多少?是不是默认初始值是零啊?那么既然有。State,那么是不是会有get和set?那么能理解了吧,这是第一步,所以说抽象类里面它装的是什么?装的是no的节点,那么你不说是队列吗?
07:01
单向双向对应在哪可以看到?不妨我们打开node节点的注射。这是noe吧?请看上面是不是有个头尾。Viw前节点,那么告诉我这个是不是就是我们最经典的什么CLH的队列?所谓的我们的A队列就是在它的基础上又做了个变种,把它从单向的变成一个双向,那么大家请看。既然是链表,是不是一定会有前指针和后指针呢?那么?这个no的节点大,我们在这儿可以看到它是不是里面包的是什么?是不是有一个一个的线程,那么根据我们前面所说,一次性讲到位吧,那么再看这个noe里面是不是有个前指针,有一个后指针,靠它们两个来完成我们的双向队列,我前面是哪个node节点,我后面是哪个no no的节点,那么这个node里面又有一个什么?
08:05
线程进,你看这个线程被进入到队列里面,通过这个this节点,那么也通过这个node的节点,也就是说。我们这个noe里面装的就是一个一个线程,你可以把它理解为这个就是后客区的一把椅子,这个线程节点就是来办理业务的一个一个没有抢到号的,在后客区里面的顾客,他坐在椅子上,然后在我们的AQS同步队列器里面安静的等着,等着下一次被叫号,被抢锁,被唤醒,被通知好,那这个就是我们的是吗?理解一下no的节点,实现所的分配。好。那么回到前面我们的。有个小理论,我们这儿读读了一下。走起。请求共享资源的线程封装成队列的节点node,那么这个node节点刚才我们从代码的层面给大家解释了为什么是红色,每一个没抢到锁的线程都将会被封装成一个漏斗节点跑到这儿,你看这是不是叫等待线程进去排队给我后着准备去抢锁好,那么这个就是我们aqs的。
09:16
理论上的初步。
我来说两句