欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

AbstractQueuedSynchronizer(AQS)鎖狀態(tài)同步和排隊(duì)管理

 更新時(shí)間:2023年11月02日 09:03:21   作者:lane  
這篇文章主要介紹了為大家AbstractQueuedSynchronizer(AQS)鎖狀態(tài)同步和排隊(duì)管理源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

AbstractQueuedSynchronizer

AbstractQueuedSynchronizer簡(jiǎn)稱AQS,ReentrantLock,ReentrantReadWriteLock,CountDownLatch,Semaphore等等這些鎖都是基于AQS實(shí)現(xiàn)的。

AQS核心主要實(shí)現(xiàn)了鎖的狀態(tài)的同步,隊(duì)列排隊(duì)、喚醒管理,鎖的釋放等底層功能。

主要基于state屬性來(lái)控制鎖的可用狀態(tài),通過(guò)維護(hù)一個(gè)CLH雙向鏈表隊(duì)列來(lái)管理并發(fā)獲取鎖的線程進(jìn)行排隊(duì)。

主要屬性

/**
 * 隊(duì)列頭節(jié)點(diǎn),延遲初始化,除了初始化時(shí)僅能通過(guò)setHead方法修改
 */
private transient volatile Node head;
/**
 * 隊(duì)列尾節(jié)點(diǎn),延遲初始化,僅通過(guò)enq方法修改添加等待節(jié)點(diǎn)
 */
private transient volatile Node tail;
/**
 * 同步器狀態(tài)
 */
private volatile int state;

CLH隊(duì)列節(jié)點(diǎn)屬性

static final class Node {
    /** 共享鎖標(biāo)記 */
    static final Node SHARED = new Node();
    /** 獨(dú)占鎖標(biāo)記 */
    static final Node EXCLUSIVE = null;
    /** 節(jié)點(diǎn)取消排隊(duì),可能由于超時(shí)或者中斷 */
    static final int CANCELLED =  1;
    /** 當(dāng)前節(jié)點(diǎn)的下個(gè)節(jié)點(diǎn)是阻塞或即將阻塞,當(dāng)節(jié)點(diǎn)釋放鎖或取消時(shí)應(yīng)該喚醒unpark下個(gè)節(jié)點(diǎn) */
    static final int SIGNAL    = -1;
    /** 條件隊(duì)列節(jié)點(diǎn) */
    static final int CONDITION = -2;
    /**
     * 標(biāo)識(shí)下個(gè)節(jié)點(diǎn)無(wú)條件傳播(適用與共享鎖)
     */
    static final int PROPAGATE = -3;
    //節(jié)點(diǎn)等待狀態(tài),0,CANCELLED,SIGNAL,CONDITION,PROPAGATE
    volatile int waitStatus;
    //上個(gè)節(jié)點(diǎn)
    volatile Node prev;
    //下個(gè)節(jié)點(diǎn)
    volatile Node next;
    //節(jié)點(diǎn)線程
    volatile Thread thread;
    /**
     * 共享鎖時(shí)值為 SHARED
     * 條件隊(duì)列時(shí)指向條件隊(duì)列下個(gè)節(jié)點(diǎn)
     */
    Node nextWaiter;

主要流程

核心方法

//判斷當(dāng)前請(qǐng)求是否需要排隊(duì)
public final boolean hasQueuedPredecessors() {
    Node t = tail;//尾節(jié)點(diǎn)
    Node h = head;//頭節(jié)點(diǎn)
    Node s;
    return h != t &&//h==t時(shí)代表沒(méi)有線程排隊(duì),見(jiàn):java.util.concurrent.locks.AbstractQueuedSynchronizer#enq()
        ((s = h.next) == null || s.thread != Thread.currentThread());
        //
        //s.thread != Thread.currentThread() 判斷第一個(gè)排隊(duì)線程是否是當(dāng)前線程
}

以上就是AbstractQueuedSynchronizer(AQS)鎖狀態(tài)同步和排隊(duì)管理的詳細(xì)內(nèi)容,更多關(guān)于AbstractQueuedSynchronizer鎖狀態(tài)管理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論