搞懂多线程(十)之AQS

一、概念

AbstractQueuedSynchronizer是一个抽象类,缩写AQS:是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石,通过内置的CLH(FIFO)队列的变种来完成资源获取线程的排队工作,将每条将要去抢占资源的线程封装成一个Node节点来实现锁的分配,有一个int类变量表示持有锁的状态(private volatile int state),通过CAS完成对status值的修改(0表示没有,1表示阻塞)

二、原理说明

  1. 业务场景,比如说我们有三个线程A、B、C去银行办理业务了,A线程最先抢到执行权开始办理业务,那么B、C两个线程就在CLH队列里面排队如图所示,注意傀儡结点(灰色的)和B结点C节点的状态都会改为-1

  1. A线程办理好业务,离开的时候,会把傀儡结点的waitStatus-1改为0 ,并且去除prevnext引用,等待GC回收,B和C节点将status从1改为0

  2. 这个时候如果B上位,首先将status0改为1(表示占用),把thread置为线程B

    会执行如下图的①②③④,会触发GC,然后就把第一个灰色的傀儡结点给清除掉了,这个时候原来的B结点重新成为傀儡结点

参考: (259条消息) Juc24_AQS的概述、体系架构、深入源码解读(非公平)、源码总结_所得皆惊喜的博客-CSDN博客