AbstractQueuedSynchronizer(AQS)锁状态同步和排队管理
作者:lane
这篇文章主要介绍了为大家AbstractQueuedSynchronizer(AQS)锁状态同步和排队管理源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
AbstractQueuedSynchronizer
AbstractQueuedSynchronizer简称AQS,ReentrantLock,ReentrantReadWriteLock,CountDownLatch,Semaphore等等这些锁都是基于AQS实现的。
AQS核心主要实现了锁的状态的同步,队列排队、唤醒管理,锁的释放等底层功能。
主要基于state属性来控制锁的可用状态,通过维护一个CLH双向链表队列来管理并发获取锁的线程进行排队。
主要属性
/** * 队列头节点,延迟初始化,除了初始化时仅能通过setHead方法修改 */ private transient volatile Node head; /** * 队列尾节点,延迟初始化,仅通过enq方法修改添加等待节点 */ private transient volatile Node tail; /** * 同步器状态 */ private volatile int state;
CLH队列节点属性
static final class Node { /** 共享锁标记 */ static final Node SHARED = new Node(); /** 独占锁标记 */ static final Node EXCLUSIVE = null; /** 节点取消排队,可能由于超时或者中断 */ static final int CANCELLED = 1; /** 当前节点的下个节点是阻塞或即将阻塞,当节点释放锁或取消时应该唤醒unpark下个节点 */ static final int SIGNAL = -1; /** 条件队列节点 */ static final int CONDITION = -2; /** * 标识下个节点无条件传播(适用与共享锁) */ static final int PROPAGATE = -3; //节点等待状态,0,CANCELLED,SIGNAL,CONDITION,PROPAGATE volatile int waitStatus; //上个节点 volatile Node prev; //下个节点 volatile Node next; //节点线程 volatile Thread thread; /** * 共享锁时值为 SHARED * 条件队列时指向条件队列下个节点 */ Node nextWaiter;
主要流程
核心方法
//判断当前请求是否需要排队 public final boolean hasQueuedPredecessors() { Node t = tail;//尾节点 Node h = head;//头节点 Node s; return h != t &&//h==t时代表没有线程排队,见:java.util.concurrent.locks.AbstractQueuedSynchronizer#enq() ((s = h.next) == null || s.thread != Thread.currentThread()); // //s.thread != Thread.currentThread() 判断第一个排队线程是否是当前线程 }
以上就是AbstractQueuedSynchronizer(AQS)锁状态同步和排队管理的详细内容,更多关于AbstractQueuedSynchronizer锁状态管理的资料请关注脚本之家其它相关文章!