java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > AbstractQueuedSynchronizer锁状态管理

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锁状态管理的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文