AQS (AbstractQueuedSynchronizer) 详解
AQS,全称 AbstractQueuedSynchronizer,是JUC框架中最重要的类,是J.U.C 中绝大部分的工具类的基础,也是必经之路。
使用层面上AQS有两大功能实现:独占和共享
独占锁,每次只能有一个线程持有锁,比如ReentrantLock就是以独占方式实现的互斥锁 。
共享锁 ,允许多个线程同时获取锁 ,并发访问共享资源 , 比 如ReentrantReadWriteLock。

Node节点(源码)
static final class Node { static final Node SHARED = new Node(); //共享模式的标记 static final Node EXCLUSIVE = null;//独占模式的标识 static final int CANCELLED = 1;//线程被取消 static final int SIGNAL = -1;//标志着后继线程(即队列中此节点之后的节点)需要被阻塞.(用于独占锁) static final int CONDITION = -2;//标志着线程在Condition条件上等待阻塞.(用于Condition的await等待) static final int PROPAGATE = -3;//下一个acquireShared方法线程应该被允许。(用于共享锁) volatile int waitStatus;//状态 volatile Node prev; //前置节点 volatile Node next;//后置节点 volatile Thread thread;//当前线程 Node nextWaiter;//指向Condition队列 final boolean isShared() {//共享 return nextWaiter == SHARED; } final Node predecessor() throws NullPointerException {//获得当前节点的前置节点 Node p = prev; if (p == null) throw new NullPointerException(); else return p; } //构造方法 Node() { } // 使用在addWaiter方法中 Node(Thread thread, Node mode) { this.nextWaiter = mode; this.thread = thread; } //使用在Condition条件中 Node(Thread thread, int waitStatus) { this.waitStatus = waitStatus; this.thread = thread; } }
总结:获取锁和释放锁的过程就是Node的变化过程
具体如果使用见ReentrantLock的源码分析:https://www.cnblogs.com/dyg0826/p/10467514.html
另外:整个JUC包中很多地方用到了 cas 无锁化机制,见手绘图

=========================================================================================================================================
我只是一粒简单的石子,未曾想掀起惊涛骇浪,也不愿随波逐流
每个人都很渺小,努力做自己,不虚度光阴,做真实的自己,无论是否到达目标点,既然选择了出发,便勇往直前
我不能保证所有的东西都是对的,但都是能力范围内的深思熟虑和反复斟酌

浙公网安备 33010602011771号