上篇部落格稍微介紹了一下aqs,下面我們來關注下aqs的所獲取和鎖釋放。
aqs包含如下幾個方法:
acquire(int arg):以獨佔模式獲取物件,忽略中斷。
acquireinterruptibly(int arg): 以獨佔模式獲取物件,如果被中斷則中止。
acquireshared(int arg): 以共享模式獲取物件,忽略中斷。
acquiresharedinterruptibly(int arg)以共享模式獲取物件,如果被中斷則中止。
tryacquire(int arg):試圖在獨佔模式下獲取物件狀態。
tryacquirenanos(int arg, long nanostimeout):試圖以獨佔模式獲取物件,如果被中斷則中止,如果到了給定超時時間,則會失敗。
tryacquireshared(int arg):試圖在共享模式下獲取物件狀態。
tryacquiresharednanos(int arg, long nanostimeout):試圖以共享模式獲取物件,如果被中斷則中止,如果到了給定超時時間,則會失敗。
對於lock.lock()最終都會呼叫aqs的acquire()方法,semaphore.acquire()最終會呼叫aqs的acquiresharedinterruptibly()方法,其中acquire()源**如下:
public
final
void
acquire(int arg)
tryacquire:去嘗試獲取鎖,獲取成功則設定鎖狀態並返回true,否則返回false。
addwaiter:將當前執行緒加入到clh佇列隊尾。
acquirequeued:當前執行緒會根據公平性原則來進行阻塞等待,直到獲取鎖為止;並且返回當前執行緒在等待過程中有沒有中斷過。
selfinterrupt:產生乙個中斷。
其主要流程如下:
1、首先執行緒嘗試獲取鎖,如果成功則直接返回,不成功則新建乙個node節點並新增到clh佇列中。tryacquire嘗試獲取鎖,addwaiter則新建節點並新增到clh佇列中。其中tryacquire,aqs並沒有提供實現,它僅僅只是丟擲乙個異常,具體的實現需要各個鎖自己實現。
protected
boolean
tryacquire(int arg)
addwaiter後面講述。
2、acquirequeued主要功能是根據該節點尋找clh佇列的頭結點,並且嘗試獲取鎖,判斷是否需要掛起,並且返回掛起標識。如下:
final
boolean acquirequeued(final node node, int arg)
if (shouldparkafte***iledacquire(p, node) &&
parkandcheckinterrupt())
interrupted = true;
} } catch (runtimeexception ex)
}
selfinterrupt:產生乙個中斷。如果在acquirequeued()中當前執行緒被中斷過,則需要產生乙個中斷。
private
static
void
selfinterrupt()
aqs釋放鎖的方法主要有:
release(int arg):以獨佔模式釋放物件。
releaseshared(int arg): 以共享模式釋放物件
tryrelease(int arg):試圖設定狀態來反映獨佔模式下的乙個釋放。
tryreleaseshared(int arg):試圖設定狀態來反映共享模式下的乙個釋放。
釋放鎖相對於獲取鎖來說還是比較簡單的,其主要流程如下:
其**如下(release()):
public
final
boolean
release(int arg)
return
false;
}
tryerelease():嘗試釋放鎖,aqs也同樣沒有提供實現,具體實現方法要其子類自己內部實現,aqs僅僅只是丟擲乙個異常。
protected
boolean
tryrelease(int arg)
c 多執行緒基礎二 鎖
執行緒之間的鎖有 互斥鎖 條件鎖 自旋鎖 讀寫鎖 遞迴鎖。一般而言,鎖的功能越強大,效能就會越低。互斥鎖用於控制多個執行緒對他們之間共享資源互斥訪問的乙個訊號量。也就是說是為了避免多個執行緒在某一時刻同時操作乙個共享資源。例如執行緒池中的有多個空閒執行緒和乙個任務佇列。任何是乙個執行緒都要使用互斥鎖...
多執行緒執行原理分析 GiL鎖 執行緒互斥鎖
首先丟擲問題 1.gil鎖和執行緒互斥鎖在整個程式中有何屌用?鎖的是什麼?2.多執行緒究竟是如果競爭offer?作業系統 直譯器 執行多執行緒的流程?直接貼圖 個人理解 參考繪製,如有問題,請指正 解釋 t1 1.執行緒1和執行緒2分別讀取共享資料池變數a的指標 2.t1競爭到gil鎖,cpytho...
多執行緒中,執行緒獲取的究竟是誰的鎖
public class sample catch interruptedexception e finally public void second catch interruptedexception e finally public class solution 示例 中,兩個執行緒在競爭鎖,...