00:00
好,同学们,我们继续通过前面的学习,我们已经给大家介绍了可重入锁和罗support,详细给大家从理论到编码进行过相关的讲解,那么为后续我们学习AQS打下了良好的基础。接下来我们就要揭开AQS的神秘面纱,再次强调高UC里面最重要的基础柱石。就是AQ这个思想翻译过来它的直面意思,英文所写的抽象的队列同步器。好,同学们走起老规矩,严格学习三板斧理论实操小总结,那么这一章是我们的一个硬骨头,务必请同学们坚持到底,因为带着大家进行源码的深度解读会有一些枯燥,但是如果你想成为真正对标大厂P6P7的程序啊,这个内功是非常非常重要,请同学们务必能够坚持跟到最后。走起。
01:00
来看看。各大厂有没有卡?那么最近的反馈啊,这个aqs是几乎现在就跟多线程里面的线程池一样,问一个考一个,问一个考一个,基本上逃不掉,那么同学们。来给我反馈的啊。这是你们的学姐和学长也依旧在挑战大厂。那么。走起,我们来可以简单的看一下这些题目,这些集合类,以前呢大家呢都会考一些什么瑞list,现在哈希迈普考的也就是。中规中矩,因为问的会的人也多了,这些我们都讲过了,看看哈,也过来呢,说的比较多了,好,那么我们呢,回到我们的重点。Re,洛克实现原理简单说一下AQS。不废话,所以说呢,这些东东必须要学会哈,为大厂的冲刺做准备,为大厂进行针对性的训练,搞定这些知识点。
02:02
所以呢,请同学们走起。那么。前置知识啊,我们就不废话了,这些基本上都说过了,现在那么公平锁非公平锁我们都明白啊。对于我们的。AQS而已啊。它是guc里面的重要基础,对于我们的re lock可重入所而言的话呢,它呢有两种公和非公平,这个我也不再啰嗦了。走起可重入锁,这两个刚讲过过,自学。哎,恐怕我们三年前就开始讲了吧,对吧,四年前甚至是我们讲goc,是不是说过一个东西叫CAS啊,比较并交换这么一个概念,那么数据结构链表。就说我们刚刚开始学,就是宋文康老师,柴林燕老师给大家讲解的哈西map,那么是不是瑞list link list等等对于数据结构、链表的概念都有所涉及过,那么模板模式啊,我们杨哥在讲如keepper的时候,用zoo实现分布式所也说过了。
03:07
基本上都是一大堆抽象类,把父类定义的足够高,把落地的实现放在子类,形成钩子程序,OK,所以说这些知识啊,你不会白学,整明白了以后我们研究。AQS的源码非常有帮助,那么好了。接下来我们要看看aqs啊,它到底是什么好。走起,字面意思啊,就是抽象的队列同步器,那么它在哪呢?首先打开我们的这个啊,我们先提前剧透,干脆重来一次。这是一个DEMO,没方法式入口,这一行代码我不解释啊,同学们都懂,那么现在我一点开它,我们先混,先混个眼神。这个是我们长期长期用的re lock,别的不管,你先看一下这个类里面是不是有一个抽象的静态内部类,叫SYNC,它是不是继承了一个东西,叫抽象的队列同步器。这么一个好。
04:08
点开它,那么同学们,我们一直所说的aqs就是指它,那么它在源代码里面的什么地方呢?同学们走起。Go又是一包下面的洛克斯包下面。A。QS啊,近似的,它有三个。也就这三个,那么它们互为关联,最重要的就是我们,它这个通常我们所谓的aqs就是指它,但是要明白这三个包啊,他们都是有关联,那么何以见得呢?那么同学们请看这个类是不是我们的aqs啊,但是它继承了有哪一个是不是抽象的拥有者的这个动作,那么你看,所以说他们三个呢?长得非常近似,要小心甄别。我们只要这么一个类好。你先记着一个名词啊,它叫抽象的队列同步器,好,那么同学们。
05:05
至少我们先明白了,说抽象的。什么概念?模板设计模式里面我们都说过,是不是要尽量的把一些抽象方法足够的往上顶,放到我们的副类里面,那么如果说是抽象,我们都会明白Java里面有个关键字啊,叫abstract,那么也就是这个东东,一般我们说过抽象类。要干嘛,接口必然要被实现,抽象类是不是一般作为负类要被继承啊,那所以说说明这个类一般不抵在前面,它都是躲在后方。我前面讲过,它是UC的基框架,所以说。它里面就定义了一些足够高的方法,供大家调用好。这是第一步,所谓的抽象说明它是个抽象类。第二个对立。那么好。最基础的数据结构账跟队列是不是先进先出啊?队列又主要的是两种单。
06:04
链表和双链表,OK,那么一样,我们的阿瑞list是不是就是一个最经典的队列,最经典的一个链表结构啊,那么它呢,也要靠这些链表和相应的数据结构完成它的队列的内容,那么说白了。各个县城要来抢锁,抢得到的去用,抢不到的你是不得安排人家排队呀,那么再来什么鬼,同步注意。第二个意思叫同步器,这是两个概念。那么,不妨我们先来看看这个抽象类。他又有哪些方法?同学们请粗略的看一下。尝试抢占所等等释放等等尝试抢占OK,那么。告诉我这个东东是不是就是我们在对于所的抢占的一些提前。
07:04
定义进负类的一些公用通用的方法呀,那么所以说请同学们要注意。在字面意思上它很强大,首先抽象的符合模板模式,作为核心负类给大家继承。队列要进行抢不到锁的现成的管理,最后有同步器尝试着在队列里面再去抢占锁,要把这些排队暂时还没有抢到锁的线程给你管理好,所以说它的功能可不是简单的一个加锁检索这么简单。好,那么看完源码以后我们也明白了,近似的有这么三个。主要就是说它,那么接下来我们先最基础的说一下它的技术解释。来。所谓AQS啊,是用来构建锁或者其他同步器组件。
08:02
说锁。明白。这个是不是就是我们的锁长期用的是不是洛克安洛克。那么什么叫其他同步器组件呢?我们有没有学过康、lunch SIM CCL bar等等,甚至读写锁?所以说这一套GUUC的能够跟锁相关的组件,他们都需要有些通用的特性。与其人人带一份,不如做一个abstract抽象类,成为最高级的上帝视角的一个副类,来进行这些重量级的基础框架,形成整个guc体系的基石。所以说,再次强调aqs是基石类的框架,它内部通过内置的先进先出的队列来完成资源的获取和现成的排队工作,并通过一个in特类型的变量表示持有所得状态。类似于一个信号灯,如果现在是零这个特型的说明没有人抢到锁,如果in特型是一,说明有人在持某一个线程在持有这个锁被抢到了,那么其他没抢到锁的将要把它放到队列里面。
09:13
进行管理。并安排他们后续继继续强索,有点这个队列有一点像我们以前在县城池里面讲过的银行里面排队的后客区,好,那么这是文字类的说明,那么。总结。就是。一个队列加一个int类型的变量,表示所的持有状态,它叫state,同学们什么都不要管,先学理论的时候,第一次学先给我囫囵吞枣,给我拿下来。你现在可以非常粗糙的认为,所谓的aqs啊,就是一个英特类型的变量叫S,它来决定所得。占用和没有占用的状态,零代表是自由状态,没有占用。
10:00
大于零代表是这个被占用,那么那些抢不到现成的,我要把它放到一个队列里面进行管理,争取下一次再继续抢,这样一种体系结构就是我们AQS,它来。构建我们的。同步状态这些组件的队列管理和强索的机制,那么首先它呢,就可以把它理解为aqs,就等于state状态。变量再加一个CLH队列fio,那么这个CH是三个计算机科学家的名字首字母,它默认是个单向链表,但是AQS呢?在CLH队列的基础上做了一个变种,完成了一个虚拟的双向队列。OK,好,那么同学们。如果到这儿你会觉得稍微有点枯燥和懵逼,都是正常,第一次听,但是不要着急,现在你就先给我记得一个状态就行了。那么aqs啊,就是。变量加一个队列。
我来说两句