搞懂多线程(十)之AQS
一、概念
AbstractQueuedSynchronizer是一个抽象类,缩写AQS:是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石,通过内置的CLH(FIFO)队列的变种来完成资源获取线程的排队工作,将每条将要去抢占资源的线程封装成一个Node节点来实现锁的分配,有一个int类变量表示持有锁的状态(private volatile int state),通过CAS完成对status值的修改(0表示没有,1表示阻塞)
二、原理说明
业务场景,比如说我们有三个线程A、B、C去银行办理业务了,A线程最先抢到执行权开始办理业务,那么B、C两个线程就在CLH队列里面排队如图所示,注意
傀儡结点
(灰色的)和B结点
和C节点
的状态都会改为-1
当
A线程
办理好业务,离开的时候,会把傀儡结点的waitStatus
从-1
改为0
,并且去除prev
和next
引用,等待GC回收,B和C节点将status从1改为0这个时候如果B上位,首先将
status
从0
改为1
(表示占用),把thread置为线程B会执行如下图的①②③④,会触发GC,然后就把第一个灰色的傀儡结点给清除掉了,这个时候原来的B结点重新成为傀儡结点
参考: (259条消息) Juc24_AQS的概述、体系架构、深入源码解读(非公平)、源码总结_所得皆惊喜的博客-CSDN博客