0.来源说明
本文是对尚硅谷2020最新版Java面试题第三季(java大厂面试题,周阳主讲)中的AQS 视频资料的学习整理
1.前置知识
公平锁和非公平锁
可重入锁
LockSupport
自旋锁(CAS)
数据结构之链表
设计模式之模板设计模式
2.是什么
1)字面意思:抽象的队列同步器
抽象的:说明是个抽象类,提供了很多模板方法供子类实现
队列:对抢不到锁的队列进行管理
同步器:
2)技术解释
是用来构建锁或者其他同步组件的重量级基础框架,
通过内置的FIFO队列来完成资源获取线程的排队工作,并通过一个int类型变量表示持有锁的状态。
是整个JUC体系的基石。(FIFO队列 + state)
3.AQS为什么是JUC内容中最重要的基石
使用AQS实现的组件:ReentrantLock、CountDownLatch、ReentrantReadWriteLock、Semaphore
理解锁和同步器的关系
锁,面向锁的使用者(定义了程序员和锁交互的使用层API,隐藏了实现细节,你调用即可)
同步器,面向锁的实现者(统一规范并简化了锁的实现,屏蔽了同步状态管理、阻塞线程排队和通知、唤醒机制等)
4.能干嘛
加锁会导致阻塞:有阻塞就需要排队,实现排队必然需要有某种形式的队列来进行管理
解释说明:
5.AQS初步
5.1AQS初识
官网解释
有阻塞就需要排队,实现排队必然需要队列
AQS使用一个volatile的int变量来表示同步状态,通过CAS完成对state值得修改;
通过内置的FIFO队列来完成对获取资源的线程(抢占资源的线程封装成一个Node节点来实现锁的分配)的排队工作。
5.2AQS内部体系架构
1)AQS自身
AQS的int变量:同步状态state——相当于银行办理业务的受理窗口状态:0表示没人,可直接办理业务;大于等于1表示有人占用窗口,需要等待
AQS的队列:FIFO队列——相当于银行大厅,等待办理业务的人需要在大厅排队等待叫号
总结一下:
有阻塞就需要排队,实现排队必然需要队列。
state同步状态 + FIFO队列
2)内部类Node
Node的int变量
内部结构
属性说明