阳哥讲面试题(五)各种锁,LockSupport,AQS
可重入锁(又名递归锁)
概述
可重入锁种类
隐式锁(即synchronized使用的锁)默认是可重入锁
Synchronized可重入的实现原理
多啥会多出来一个,是为了防止发生异常也可以退出锁
显式锁(即Lock)也有ReentrantLock这样的可重入锁
LockSupport
是什么
线程等待唤醒机制(wait/notify)的改良加强版
3种让线程等待和唤醒的方法
Object类中的wait和notify实现线程等待和唤醒
可能会发生两种异常
Condition接口中的await和signal实现线程等待和唤醒
产生的问题同上
传统的Synchronized和Lock实现等待唤醒通知的约束
LockSupport类中的park等待和unpark唤醒
底层原理
代码
如果先unpark再park也不会阻塞,解决了上述两种出现的问题
解释
重点
相关的面试题
AbstractQueuedSynchronizer(抽象的队列同步器)之AQS
源码所在
AQS为什么是JUC中最重要的基石
理解锁和同步器的关系
- 锁,面向锁的使用者
- 同步器,面向锁的实现者
AQS初步
官网解释
有阻塞就需要排队,实现排队必然需要队列
AQS内部体系架构
node类
从ReentrantLock开始解读AQS
ReentrantLock加锁过程
概述
- 尝试枷锁
- 加锁失败,线程进入队列
- 线程入队列后,进入阻塞状态
详解
参考模拟图
这是A在占用
A执行完,B获得执行权