AQS原始碼閱讀

2022-10-11 16:48:12 字數 1392 閱讀 2542

aqs是用來構建鎖或者其它同步器元件的重量級基礎框架及整個juc體系的基石,通過內建的fifo佇列來完成資源獲取執行緒的排隊工作,並通過乙個int類變數

表示持有鎖的狀態。

我將以reentrantlock為切入點,閱讀asq原始碼。

注:reentrantlock預設是執行緒不安全的,當然也可以設定為執行緒安全。

一、lock.lock();

final

void

lock()

public

final

void acquire(int

arg)

tryacquire()

final

boolean nonfairtryacquire(int

acquires)

}else

if (current ==getexclusiveownerthread())

return

false

;//沒搶到獨佔鎖,返回false

}

當嘗試獲取鎖失敗時,需要加入等待佇列,但加入等佇列的時候,還會進行對獨佔鎖的搶占。

先加入等待addwaiter(node.exclusive);(exclusive為null)

if (shouldparkafte***iledacquire(p, node) && //p(哨兵節點)waitstatus設定為signal (-1)parkandcheckinterrupt())

interrupted = true

; }

} finally

}除了首個進入佇列的節點的waitstatus=1,後續加入的節點都為0,且不會搶奪獨佔鎖

解鎖lock.unlock

public

final

boolean release(int

arg)

return

false

; }

AQS原始碼閱讀感想

1.aqs核心原理 aqs擁有變數state,通過cas設定state得值是否成功判斷是否獲得鎖,原始碼如下 compareandsetstate c,nextc protected final boolean compareandsetstate int expect,int update 獲得鎖...

AQS原始碼閱讀筆記(一)

aqs原始碼閱讀筆記 先看下這個類張非常重要的乙個靜態內部類node。如下 static final class node 查詢當前節點的前乙個節點 final node predecessor throws nullpointerexception node node thread thread,...

AQS原始碼解析

公平鎖 fairsync 核心方法 public final void acquire int arg tryacquire arg 方法 protected final boolean tryacquire int acquires 重入鎖 state 1 else if current gete...