00:00
下面我们接着给大家进行我们AQS的相关的源码分析和理论知识。那么大家请看。通过前面的介绍前置知识啊,我们呢,后续在实际的源码当中层层递推,慢慢展开,但是呢,在学习之前先和大家说一嘴,我们不能直接上来就说源码分析太枯燥太乏味,所以说呢,分成三段,一。中难先给大家明白aqs啊,一些相关的约定,并给大家解释啊为什么它是JC并发编程的最重要的框架基石,然后有这些理论知识储备以后,我们再进行深度的源码分析和讲解,好,那么下面请跟着过来。第一节AKS入门级别的理论知识,那么来吧。首先AQS啊是什么?完整的英语单词名字这么长的一堆,那么我们大概混个眼熟,直接过来翻译来,字面意思叫抽象的队列同步器,那么好在JDK的世界里面,它源码位置在哪呢?我们来同学们先看理论。
01:16
在我们今天K的源码里面,它在并发包的锁包下面有这么三个,大家看啊,类似的,但是呢,叫AQS的只有两个。首先第一个啊,我给大家抓图下来了。叫as。这个是下面这两个的公共户内。第二个这个叫AQ long s。第三一个,这个叫aqs,好,那通常我们所说的aqs主要就是指蓝色圈圈的第三个abstract que sizer,也就是抽象的队列同步器,好的,那么来同学们不妨呢,我们简单的看一下源码。
02:03
在我们的工程下面1.8。RT点价包,也就是JDK的源码包里面Java。U并发报洛斯,那么刚才大家在脑图上所见的就这三个,那么路径就是他们好三者关系,大家请简单的看一下。D。这个就是我们今天着重要讲的AQA4啊,它是guc里面最重要的底层基础框架。首先版本来自于JDK多少1.5道格力这个大神所编写的。第二个抽象类。第三一个继承谁抽象的。Honorable synchr,首先继承这个负类好。接下来再看它叫抽象的,加了个浪型的,其他都跟as一样,谁1.6。
03:00
所出身的,然后他同样继承了我们的抽象的honorable synchizer,所以说他们两个这个是更早出现的,更加具有代表性,那么目前业内我们主要是来研究它,它们两个是。孪生兄弟可以这么讲,是后续版本在这个的基础上面又延伸出来的,所以说它是最具有代表性的。那么明白了这三者的关系,Aqs AQ long s和我们的抽象分类,好的,那么接下来我们呢,就要来解释解释,首先抽象的队列同步器,从理论到我们的源码。为了避免干扰,关闭我们的AQ long s就着重看他专心致志的攻破它来进行冲锋,撕开这个口子,获得知识。那么他。所谓的抽象来抽象类啥意思啊?我就是没讲,但凡你对Java面向对象的思想大致有了解的都会清楚。抽象类怎么着,相当于我们的贝斯负类,一定是下面很多种情况,大多数类通用共用的一些方法。
04:12
规范基础架构组件需要把它往上提的足够高,形成一个统一的副类,供大家封装好以后供大家使用,继承、修改。所以第一个抽象的意思啊,我们就会明白一定是什么基础复类,足够高的标准和规范。第二个队列的什么叫队列,什么情况下会用到队列,大家都清楚。AQS是GC底层的核心组件类,整个GC主要干一件事,就叫高并发多线程,那么多线程一定涉及到什么锁的真强。那么现在哪一个线程捷足先登了,强到锁谁就去使用,那么没有抢到锁的呢?那么这个时候是不是需要进行?
05:06
遇到队列里面来进行排队呀,那么也就是说把所继续分配给谁的一种规范和规矩,规则,需要有一个队列来保证那些抢不到锁的兄弟们能够进到一个队列来进行后续的争抢,OK,那么相当于说给大家提供了一种什么,就像等飞机去银行办理业务一样的后客区,那么最后synchizer,那么涉及到同步相关的一种规范和管理,所以说他一定是最顶级的高层的柱石。好,那么下面源代码。我们呢,做过简单的了解,那么技术上的解释来,同学们。是用来实现锁或者其他,注意同步器组件的公共基础部分的什么抽象实现,否则就不会叫abstract抽象的,对吧?一定是贝斯负类提的足够高,那么它是重量级的基础框架,也是整个GC高并发体系。
06:09
多线程编程的基石主要用于解决锁分配给谁的问题,那么我们大家都清楚,假设啊,现在这呢是一个银行的业务窗口,那么目前已经有一个顾客在里面办理业务,那么下面呢,还有一堆顾客,那不能大家都去抢吧?那么所以说过来吧,这相当于银行的什么等候区。对吧,或者叫什么类似于飞机场的候客区。OK,那么现在不好意思啊,同一时间段,比如说像think或者lock lock只能有一个人抢到这个窗口去办理业务,那么剩下的大家也别搞得特别紧张,那么有序排队好吧,那么尽量按照一种规矩,一种规范来进行资源的协调和分配,保证我们的程序稳定的运行好。
07:04
那么所以说我们这儿呢,可以来看看,它呢是基石,主要用于解决锁分配给谁的问题,那你凭什么有这个能耐,我们为什么要听你的,那么接接下来,那么同学们请看我们官网相关的解释啊,这个呢,我为了避免反复切换,那么和大家说一下,几乎都来自于官网。来。在这儿。请看红色部分和蓝色框框这一段原版的官网解释。它提供了一种框架。那么是为实现阻塞所和相关同步器提供的一个框架。首先可以得到它as这个抽象类就是一种框架基础代码,它是依赖于注意一个first in first out都清楚O的什么wait choose。提供一个先进先出的什么等待队列,那么来同学们是不是刚才所说的这三个不能去抢吧,肯定乱吧?那么这个分配规矩避免大家争抢过于激烈,吃相太过难堪,那么所以说需要有个队列塞进来给大家排队好。第一个概念知道了wait q,等待队列,第二个this state什么意思啊,这个状态请看。
08:23
那决定了。依靠呢,单个的原子int值来表示什么状态,通过占用和示范的这个方法改变状态值,请看acquired或者是released,那什么意思呢?他这我们会明白现在这三个顾客是不是进等候区、候客区了,你可以把它暂时的理解为。这个就是我们的fio的那个等待队列啊,待会我们会详细讲,此时请近似的理解为在这个后客区里面就是一个fio的什么队列。那么下面在这个队列里面都清楚先到先得,那么接下来。
09:05
谁会被分配到锁那么好,我怎么知道这个锁用的用完呢。你可以把它理解为在这。有一盏灯。假设这个灯它的状态值就是我们的。In特类型的这个一个状态啊,我们这先介绍基础的入门概念,没有人占用那么这个数字,比如说我们就是零,好的,那么目前有一个人来到这个窗口办理业务,持有了所抢占的这个资源,OK,那么好的,那么我们现在这个状态,这个西塔可能呢,就会变成红色,比如说我们这个塔这个值就改变成一。那么我们在程序里面,我们会清楚根据这个这个状态的值,绿色没有人用。就像去一个卫生间,去一个银行办理业务的窗口,红色说明有人在占用着,我们只能在这乖乖的等着排队,所以说他这儿从官网上他给你的介绍和解释,源码的分析,请大家看get或者set data就告诉你进去了会set,此时这个资源有人被占用,Get就看看判断能不能被。
10:20
被占用,所以说得到第一个粗浅的入门级别的理论概念。Aqs靠一个先进先出的队列和靠一个状态值来决定所的分配和相关的同步线程的管理好。那么接下来我们来继续深入。大家可以看得出。它整体就是抽象的一个fio队列来完成资源获取,现成的什么排队工作,并通过一个int类的。变量表示石油所得状态绿色0STATE,那么可能这个资源没有被抢占,现场你们去抢吧,谁抢到就是谁的,那么抢不到呢,就给我去排队,那么如果是state是一,说明这个线程当前还在持有,我们不可以动粗,只能等号。所以说它这。
11:14
大致将aqs抽象为这样,那么请看它就是一个CLH队列,那么这个是啥意思呢?那么不妨啊,我们可以去看看。那么在这儿就是刚才我们所说过的这个解释啊,靠的是一个队列,靠的是一个状态值,那么接下来我们呢,可以看到在这些源码过程当中,在这块大家请看。这是不是有个CLH这么一个关键字啊?那么这个CLH什么意思啊?是三位科学家,计算机科学家三个大牛的名字的首字母,那么XX的队列就取材于它,和它类似。但是注意。在这他给你介绍的是个什么,你可以看得出他画的是不是只有一个,但实际情况请注意它是一个什么?在源码里面,它是一个单向链表。
12:06
OK,但是实际上而言,AQ中的队列是取自于这样的思想,由crh。的这种思想继承了以后,是一个变体的虚拟的双向队列,所以说我们的AQS啊,就是这么一个模型,一双向队列,2STATE状态资源位这么一个标识来决定这个资源是否被占用,那么等待的线程就进到这个队列里面进行排队,候候,等候。这个状态释放资源变更了,我们呢在群区争抢和获得好,所以说在这。我们就要明白。它抽象的队列同步器,实质而言就是一个队列和一个in特类型的塔,状态值表示所得持有OK。那么aqs是什么?请大家先有一个入门级别的理论概念。
我来说两句