00:00
好,那么各位亲,我们继续。Aqs啊,为什么是GUUC高并发包框架当中的最重要的基础基石部分呢?那么走起。首先啊,我们来看。这几个类。我相信大家。都用过吧?不废话对吧。先不牵扯到各种的状态的变化,先不牵扯到需要持有所,抢占抢占所,放弃获得所等等等等,原诺看lunch。读写所西,那么为什么这么说呢?这些类表面上是四个,但是他们都有通用的。什么需要去?强所、范所等等一些相关的,我们必须要有一个老大,要有一个带头大哥帮我们统一构建,以便我们形成统一、规范、良好的体系。那么下面请先看源码,我节约时间,我就不再敲这四个类都提前给大家抓好图了。那么走起最常用的是它。
01:04
来,刚才我们已经看到了,这个类对外暴露,叫可重入所re lock,其实lock里面有一个S这么一个内部类。这个类又继承字aqs,得到第一个结论,我们常用的可重入锁和我们AQS抽象的队列同步器有关系。第二个类勘探lunch。基本上早就讲过,如果说看过我的大场面试题第二季的,一定记得杨哥说过说过的一句话。同学们都离开自习室以后,班长才能关门,也说过一个案例叫秦灭六国,一统华夏,那么对于勘探烂吃不懂的同学可以去看一下我的大肠面试题的第二季,那么兄弟们走起看到lunch怎么样,是不是也有这么一个C考这么一个,然后又继承这个,所以说这个肚子里面也包含这么一个AQS啊,真真正正对外暴露的用户级别的API是他,但是底层的运作机制啊,是AQS啊。
02:04
那么再来读写所,同学们请看look read look里面是不是你看?和我们之前讲的可重入锁是不是一回事?那么再来同学们SIM信号灯信号亮怎么着是不是也一样?所以说我们得到一个结论,和AQS有关的还不止啊,那么对于我们aqs框架,什么莫C读写锁、程洛克几乎都跟AQS有关。那么从源码。到我们的案例都给大家详细的证明过,你表面上看你用这个,用这个用这个,用这个是用四个不同的东西,其实底层都是aqs啊,这就是为什么现在aqs啊被大厂问的特别多,因为你简历上如果不写GOUC,不写多线程高并发,几乎没有什么面试机会了。所以说一旦写了线程啊,所S这些关键字as,一大堆的高并发的知识就来了,所以说就要看你准没准备过好。
03:06
那么下面我们呢,继续进一步的要理解所和抽象的队列同步器,我在上面呢。说过一个东西。字面意思是不是叫同步器?一再强调同步和同步器是两个概念,那么接下来同学们走起。首先所面向所的什么使用者,第二个叫同步器,面向锁的什么实现者,这是什么意思呢?这个是。Lock,我们一般都会用lock.lock然后这块是不是写我们的业务逻辑,然后用完了以后是不是lock按lock,那么同学们。我们日常编程,哎,都知道try finallylo finally unlo,这个叫用户级别,只是你使用的其中的一种锁,叫relo,那这个叫面向锁的使用者,说白了这个叫用户层面的API,也就是杨哥长期所说的是你会用,但你并不知道原理就是API调用工程师,程序员专属是面向所的使用者,这个使用者就是程序员,他干嘛?
04:17
定义了。和程序员和所交互的使用级别层面的API隐藏了后面的细节,你调用就行了,反正我可以给你搞定,保证只有一个线程来获取洛克安洛克。那么什么叫同步器啊?这个是面向使用者广大的千千万万的程序啊,那这个同步器呢,是面向锁的什么实现者,我前面说过了。Goc里面有这四个。甚至更多个,我们都牵扯到所得申请释放、超时控制等等。我们是不是需要有一种。大神有一种统一的规范,把我们全部给捏起来,我们也不能实现四种吧,我们应该有一个统一的规范,那么这种带头大哥这种。
05:03
高度抽象的就是写这种AQS框架的大神,他是面向所的什么实现者,那么这个人是谁?就是goc包的作者,Java并发大神道格利,纽约州立大学计算机系的教授,这个呢,我们在高并发的课程上面拜过神的时候。给大家看过对吧,那么他呢,提出了统一的规范,并简化了所的实现,屏蔽了同步状态的管理,阻塞线程,去排队通知,等待唤醒机制等等,这儿有四种都需要等待唤醒,比方说这个到最后了要干嘛。触发一个线程的使用,对吧。看到大lunch SIM,那么信号灯如果全部灭完了,说明被坑位被占完了,那么这个时候不能使用,所以说这些什么阻塞啊,通知啊,唤醒机制啊,你觉得应该是有来一个类有一套,还是应该有一个统一的一套,所以说。根据我们抽象高度概括的能力,我们只应该有一套统一的,所以这个就叫同步器,它是面向所的实现者,是这些大神所写的统一规范,那么好,所以说呢,我们这儿就凭这张图。
06:12
我们再次强调了aqs的重要性,好,那接下来它能解决的问题。首先,为什么需要?Aqs啊,我们都清楚。这是洛克,这是安洛克。一旦落了以后,只能有一个线程进来,来干我的业务逻辑进来这个线程干活那。没有抢到锁的这些其他线程干嘛,是不是加锁就会导致阻塞,因为这个时候是不是必须要等第一个持有锁的线程完成了以后。我们才能拿。那么一旦阻塞里后是不是会拥堵?拥堵需不需要?进行一定的管理,就好比我们现在去比较火爆的海底捞火锅店。抢到所的,抢到排位的,坑位的,进去用餐区去用餐,那么门外等的顾客也是顾客呀,那么这个时候可以给点小点心。
07:06
给一点。酸梅汤,帮你美甲,帮你擦皮鞋,这个时候是不是这样排队被阻塞的在外面,火锅店外面的这些顾客形成。叫号的机制啊,排队等待,并将排队的这些顾客好好的管理起来。所以说,注意。枷锁会导致阻塞,有阻塞就要排队,实现排队必然需要有某种形式的队列来进行管理,比如说哎,走了一桌,我们是不是在候客区就进一桌,那么排着队的就突然抢到所,就可以进去吃,进去用餐了。那么在这样的一种。同步器面向所得实现了以后,面向所的管理了以后,我们需要有这么一个东东,所以说呢。注意。抢到现场,抢到某种资源的线程,直接使用处理业务逻辑,那么就是杨哥现在刚才所说的,那么抢不到的那些呢?
08:03
必然涉及到一种排队等候机制啊。抢占资源失败的现场请继续去等待。类似银行业务办理窗口都已经满了,暂时没有受理窗口的顾客只能去候客区排队等候。等候的线程仍然保留获取所得可能。比如说。你办理业务完成了,一个窗口空了,是不是会叫号,并且获取所的流程仍然在继续后,客区的顾客也在等着叫号,轮到了再去受理窗口办理业务,那么所谓的AQS啊,就是来形成这样的一种。唤醒等待,枷锁示范、超时控制,取消等待的等等等等一系列操作,所以说这种排队里面一堆人在那等着。B叫排队,就会形成某种队列,那么这个队列应该采取一种什么样的数据结构?又好又快,并且还能完成所的抢占、等待和唤醒通知机制呢。
09:01
这边我们就出来了。如果共享资源被占用了,就是银行的受理业务的窗口已经全被占满了,就需要一定的阻塞等待唤醒机制来保证所的分配,就说白了就是什么走一个叫一个,走一个叫一个,重新能保证后客区的顾客也能办理业务,抢占到窗口,这个机制啊,就是由C队列的变体实习,那么。上一步见过了,就是我们的。东东,这个AQS队列将暂时获取不到所的线程加到队列当中,并且由AQS来维护,所以这个队列就是aqs的抽象表现,它会将请求共享的资源封装成封装成队列的节点node,这个待会我们会说红色是重点,通过CS啊比较并交换自学以及look support的这种park方式,你看这有了吧。维护set变量的状态,使并发达到同步的控制效果,所以aqs是个队列控制的同步器。好,那么同学们,这个就是AQA4,它产生的原因,为什么是最重要的基石,以及它能够干什么。
我来说两句