AQS的原理和使用

2021-10-10 01:42:04 字數 2177 閱讀 3370

什麼是aqs

全稱abstractqueuedsynchronizer

aqs實現是基於clh佇列鎖

clh同步佇列是乙個fifo雙向佇列,這三張圖是來解釋狀態改變的過程,關於clh可以自行查詢

多個執行緒時,mypred指向上乙個儲存的執行緒,並且自循檢查前乙個執行緒是否釋放鎖,自循一定次數後進入阻塞狀態

上乙個執行緒的locked等於false時,當前執行緒就可以獲取到鎖。

aqs使用方式

實現見下面鎖可重入示例**

aqs的設計模式

模版模式:具體實現交給子類去實現。自己要實現同步鎖,重寫模版方法就可以實現。

aqs中的核心方法

tryacquire和tryrelease方法。

aqs主要通過核心成員變數state來判斷是否獲取到鎖。

了解reentrantlock鎖

公平鎖

非公平鎖

區別在於公平鎖判斷當前執行緒在佇列中前面是否還有其他執行緒

同乙個加鎖方法,遞迴呼叫依然可以拿到鎖,不會出現卡死的情況。

例子:

static final lock lock = new reenterselflock();

public void reenter(int x)

} finally

}public void test()

}// 啟動3個子執行緒

for (int i = 0; i < 3; i++)

如何實現可重入鎖:

/**

*類說明:實現獨佔鎖,可重入

*/public class reenterselflock implements lock

/* 當狀態為0的時候獲取鎖*/

public boolean tryacquire(int acquires) else if(getexclusiveownerthread()==thread.currentthread())

return false;

}/* 釋放鎖,將狀態設定為0*/

protected boolean tryrelease(int releases)

if (getstate() == 0)

throw new illegalmonitorstateexception();

setstate(getstate()-1);

if(getstate()==0)

return true;

}/* 返回乙個condition,每個condition都包含了乙個condition佇列*/

condition newcondition()

}/* 僅需要將操作**到sync上即可*/

private final sync sync = new sync();

public void lock()

public boolean trylock()

public void unlock()

public condition newcondition()

public boolean islocked()

public boolean hasqueuedthreads()

public void lockinterruptibly() throws interruptedexception

public boolean trylock(long timeout, timeunit unit) throws interruptedexception

}

在aqs的tryacquire和tryrelease方法中分別對state本身加

AQS使用和原理解析

使用總結 aqs的基本原理 concurrenthashmap 獨佔式獲取同步狀態,試著獲取,成功返回true,反之為false protected boolean tryacquire int arg 獨佔式釋放同步狀態,等待中的其他執行緒此時將有機會獲取到同步狀態 protected boole...

AQS鎖機制原理

reentrantreadwritelock 與 reentrantlock 核心就是 sync aqs子類 及aqs synchronized基於 內部物件鎖 jvm指令的級別 reentrantreadwritelock 引用傳入 內部類 readlock和writelock,將其sync傳入兩...

AQS原理解析

aqs abstractqueuesynchronizer 即 抽象佇列同步器,聽起來非常拗口,沒有關係,暫且先記住佇列 同步這兩個關鍵字,需要把它理解為乙個框架,即用來實現多執行緒訪問共享資源的同步框架。比如reentrantlock semaphore countdownlatch等等的實現都依...