阳哥讲面试题(五)各种锁,LockSupport,AQS

可重入锁(又名递归锁)

概述

image

可重入锁种类

隐式锁(即synchronized使用的锁)默认是可重入锁

image
image

Synchronized可重入的实现原理

多啥会多出来一个,是为了防止发生异常也可以退出锁
image
image

显式锁(即Lock)也有ReentrantLock这样的可重入锁

image

LockSupport

是什么

image
image
image
image

线程等待唤醒机制(wait/notify)的改良加强版

3种让线程等待和唤醒的方法

image

Object类中的wait和notify实现线程等待和唤醒

image
可能会发生两种异常
image
image
image

Condition接口中的await和signal实现线程等待和唤醒

image
产生的问题同上

传统的Synchronized和Lock实现等待唤醒通知的约束

image

LockSupport类中的park等待和unpark唤醒

image

image
底层原理
image
image
代码
image
如果先unpark再park也不会阻塞,解决了上述两种出现的问题
image
解释
image

重点
image
image

相关的面试题
image

AbstractQueuedSynchronizer(抽象的队列同步器)之AQS

源码所在

image
image

image

AQS为什么是JUC中最重要的基石

image

image

image

image

image
理解锁和同步器的关系

  • 锁,面向锁的使用者
    image
  • 同步器,面向锁的实现者
    image

image

image
image

AQS初步

官网解释

image

有阻塞就需要排队,实现排队必然需要队列

image
image

AQS内部体系架构

image
image

image

node类
image
image
image
image

image

从ReentrantLock开始解读AQS

image
image
image
image
image
image
image

ReentrantLock加锁过程

概述

  • 尝试枷锁
  • 加锁失败,线程进入队列
  • 线程入队列后,进入阻塞状态

详解

image
image
image
image
image
image
image
image
image
image
image
image

参考模拟图
这是A在占用
image
A执行完,B获得执行权
image

原文地址:https://www.cnblogs.com/kaka-qiqi/p/15006394.html