00:00
好,同学们,请再坚持一下,我们继续。那么AQS啊,我们大概现在应该认为啊,通过我们的源码和前面的分析,现在应该知道了,AQS里面有一个内部类叫no,它就是一个个载体,专的就是一个一个的线程,OK,类似于一个一个的顾客,那么node。后口区的座位。这个县城就是一个个来办理业务的。顾客,那么他们放到A这个里面,形成队列的同步,那么等待着通知和唤醒。好,那接下来同学们我们要从代码层面来看看aqs的内部体系架构。走起。首先AQS啊这张图,那么大家都已经明白了,它呢?大致实现这么一个东西,你们听我说。Aqs啊,大家请看内部是不是会有一个node节点,这个是内部类的意思啊,OK,这个我们暂时不展开,今天重要的说这一支啊,然后think考蓝色的是G乘以AQ。
01:10
根据前面的源码分析。洛克街口。要有一个落地的实现类,Re enter lock可重入锁,我们用户层面,用户级别就用可重入锁,什么lock按去干活,其实你调的是这个S口这个类,而这个类实质上而言又是我们的什么AQS的此类。所以说。抢得到锁的你直接使用抢不到锁的线程,你是不是乖乖给我进去排队呀?然后在排队的过程当中,我们大家请看我们的re look,我们原来是不是说过它又分成。公平锁和非公平锁,那么也就是在抢占锁的过程当中也有两种性质,那么在这儿我们呢?待会儿我们会用re enter落口作为我们的突破口,这张图请向大家记得并知悉它们之间的因果关系和内在的逻辑联系。
02:08
好。那么接下来我们呢,先来看看aqs自身啊,它有些什么,首先刚才看过了。AQS,它是不是有一个同步状态的state的成员变量,那么这个不再废话,都读过了,同步状态叫state OK,好。他就类似于银行办理。业务的受理窗口的状态。等于零。Int类型初始值是零嘛,就是没人自由状态,任何一个现场都可以去办,先占先得,先抢先得,先到先得,大于等于一了,说明有人占用窗口。等着去,所谓的等着去就是不好意思啊,窗口有人伴着,给我去队列里面候着,好,这是一个啊,第二个就是什么。
03:00
CLH队列,那么三个大牛组成了一个,默认它是一个单向的,最后我们改了一下它内部道里这个大神借鉴了以后,把它改成了一个虚拟的双向队列。何以见得?过来。在noe上面。这个等待队列是由一系列的CH3个字母的组成的,那么它呢?通常情况下是用什么Spain通过自选等待。能跟上,在这个队列里面,比方说某个顾客在这等着,他是不是也会张望这个窗口,现在这个state如果是零,说明这个窗口释放了,我们在队列里面的是不是要开始再去抢,那么这个state变量就判断是否阻塞。最后请大家看形成这个队列,那么加入到c lock里面,这个队列里面从尾部入队,从头部出队,OK,这点英文呢,都很简单,我们按照官方原话来给大家解释,那么我们这至少可以得到了我们的第一个结论啊。
04:05
最外层同学们就是这个。呃,比如说这个黑色的这个框框,那么就是我们的。AQS2。没问题吧,它就是一个state变量加我们这个CH的一个。队列。当然这个队列记得。我们后面会说它是个双向的啊,它做了一些修改和变动,好,那么这是外面aqs最外层走起,我们继续。那么。这个黑色的框框啊,就是我们刚才所说的,类似于银行的候客区的一个一个的等待顾客。好,那么这个是我们的aqs自身总结一下就是。有阻塞,所谓的阻塞就是那那些没有抢到锁的。那些现场,那些顾客就需要排队,排队你要管理起来,我们去候客区实现排队,就必然要实现队列,那么所谓的aqs自身这个类,我们可以简单的来看,就是一个C的变量加个CR变种的双端队列好。
05:10
那么下面我们走起。说完了AQS啊,就要说AQS的内部类node,那么这同学们呢?走起啊,待会儿我们来看这个。这个注释太多了,我想把它关掉一下,这是aqs啊,里面有个类叫node,我们请看,刚才我们也看过了。As里面有个内部类叫no t t,那么是不就是双端队列?且陶指针和什么为指针,OK吧,好,这是aqs层面的,那么node类层面请看这个noe呢,有些什么什么馅的呀,我排他的呀,又是这些状态的哈,然后巴拉巴拉巴拉下来。诶。它也有一个。State。
06:00
但是它多了一个东西叫wait,然后注意这个node类里面又有一个什么前指针和什么下一个后指针,所以说呢,一定要注意,我们这就会有一个重要的概念,这个aqs啊。全部集齐了,那么就是桃纸摘。为指针。然后。还有什么,还有什么。减脂战。后指针头尾前后都有啊,待会我们源码解读的时候,同学们呢,不要懵逼。那么继续回到这儿了以后,我们会看到这个no节点里面戏可就是很精彩很丰富了,我们大致的看了一圈了以后,它有一个重要的。Wait state先混个眼熟。这个很重要。他是负责。这个每一个顾客的状态,每一个等待队列里面现成的状态,然后noe里面封装,就封装我们的线程,就是每一个请求用户顾客走起。
07:06
那么。内部类的node node类是在A类的内部啊,它的内部那么。都是。这两个啊。都有一个int类型的变量,一个叫state,是aqs的,另外一个叫什么?No的等待状态wait state乘以变量,那么它呢?叫wait state,好,这是两个变量咯,所以说这是no,那么说人话的意思就是。等候区的其他顾客啊,就是其他那些没有抢到所的线程的等待状态,Wait队列中的每个排队的个体就是一个一个的漏好,那么接下来这个node类的讲解就会费点事,同学们走起内部结构。来吧。共享模式啊,独占模式啊,这个是代表线程被取消,这个是线程被唤醒等等一系列。
08:06
好,那么都给大家说了,最重要的就是这个这个这个这个这四个相当于说这个是个aqs,它是个大类啊,它这是不是有个队列,那么在这个队列里面,我们呢,就有一个一个的封装好的漏节点。这一波听懂了吧,那么每一个note节点,它里面封装的是一个一个顾客线程。OK。那么好,这些线程之间就会由我们的前指针、后指针将其关联起来,然后形成队列。那么所以说我们在这要知道的一个东西,就是我们这个no的节点,就等于我们的这个。Status。OK表示排队的每一个节点,它的状态,再加上我们的什么东东,是不是前后。
09:01
指针的指向。来控制它的入队和。出对这块请注意,那么现在一个是aqs啊,另外一个是什么?我们的no的这个类型相当于一个大的类里面有一个小类,好,那么同学们。注意。内部结构我们简单的过了一下,那么它呢,也一大堆属性。重点。首先这个note它有一种模式,共享或者是排它,那么说明这个是以共享的模式啊,在等待着锁,这个是以独占的形式在等待锁。而任何一个。这个呢,这个node的属性就这两个啊,蓝框框的第二个重要的,我们把它罗列出来叫wait status。代表是当前节点在队列中的状态,那么它有哪些意思呢?分别就是?默认是零。取消什么意思呢?是所谓的取消,比方说我排着排着队,有没有可能这个顾客,哎呀,我不想干了,我被迫中断,前面有怎么这么多人啊,我不想等了,我走了,那么这个时候回答我在队列中等着,等着是不是可以取消啊?那么基于诸如此类。
10:10
那么它呢,表示各种状态好是从这儿。我们呢,就得到了我们队列同步器的基本的构建,说1000道1万,把这些理论总结了以后,我们最终得到的效果。就这么回事儿。OK,注意外面这个,现在这个框框就是我们的aqs状态位加我们的同步器,它同步器上面有头和尾的指针,好。第二个,每一个no节点里面封装的实际上而言是一个一个的线程thread,就是我们来银行办理业务的顾客,由于现在这个状态位,比方说是一,就说明这一个受理窗口被人占用了,我们没办法去抢到或不得所,或不得所我们就只能去排队,那么排队以后,一号顾客,二号顾客,三号顾客fio先进先出的话,那么前一个是谁?
11:06
后一个是谁通过双向队列就把这些候客区的排队顾客给你整理管理起来。方便大家以后的。进一步的强锁等待通知唤醒机制好,这就是我们aqa的全部。结构理论和状态,下面就要进行源码的分析,你看一下这张图对你有没有帮助。
我来说两句