AQS原始碼解析

2021-10-06 01:18:02 字數 2432 閱讀 3070

//加鎖從 先看一下 acquire方法開始

private

transient

volatile node head;

//頭節點 獲取鎖的執行緒節點

private

transient

volatile node tail;

//尾節點

node  內部類

//共享

static

final node shared =

newnode()

;//獨佔

static

final node exclusive = null;

//取消狀態

static

final

int cancelled =1;

//釋放資源後喚醒的後繼節點

static

final

int signal =-1

;//等待condition喚醒

static

final

int condition =-2

;//工作於共享鎖狀態,需要向後傳播,

//比如根據資源是否剩餘,喚醒後繼節點

static

final

int propagate =-3

;//等待狀態,1,0,-1,-2,-3。

volatile

int waitstatus;

//前驅節點

volatile node prev;

//後繼節點

volatile node next;

//等待鎖的執行緒

volatile thread thread;

//等待條件的下乙個節點,conditonobject中用到

node nextwaiter;

public

final

void

acquire

(int arg)

//1. 第乙個方法 預設由子類實現

protected

boolean

tryacquire

(int arg)

//加入佇列中

private node addwaiter

(node mode)

}//如果 pred是null 或者設定失敗 ,呼叫enq

enq(node)

;return node;

}//繼續接下來的 enq

private node enq

(final node node)

else}}

}//繼續

final

boolean

acquirequeued

(final node node,

int arg)

//如果 不是頭節點, 或者鎖沒有獲取成功, 呼叫 是否應該在等待佇列 parkif(

shouldparkafte***iledacquire

(p, node)

&&parkandcheckinterrupt()

) interrupted =

true;}

}finally

}//開始

private

static

boolean

shouldparkafte***iledacquire

(node pred, node node)

while

(pred.waitstatus >0)

;//前置節點 的 next 設定為當前 節點

pred.next = node;

}else

return

false;}

//在看一下 park 將該執行緒 等待

private

final

boolean

parkandcheckinterrupt()

`總結 : 先嘗試預設獲取鎖,獲取失敗加入等待佇列,等待佇列中 如果還沒有獲取, 在等待 釋放鎖之後喚醒,繼續搶占鎖,搶占不到,繼續睡

看一下釋放鎖

public

final

boolean

release

(int arg)

return

false;}

private

void

unparksuccessor

(node node)

//s 不等於 null

if(s != null)

//喚醒s執行緒

locksupport.

unpark

(s.thread)

;}

AQS原始碼解析

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

AQS原始碼解析 上

clh佇列 三個人發明的,三個人各取乙個字母命名。aqs abstractqueuedsynchronizer 裡面有基本的模板方法,包括操作同步佇列和條件佇列等。繼承aqs子類可以自己選擇實現的方法有 原始碼解析中術語說明 獲取獨佔鎖 public final void acquire int a...

AQS原始碼分析

如上 用jmeter模擬30個請求同時下單,結果30個請求都下單成功,產生了超賣問題。下面實現自定義乙個同步器來實現自定義鎖 2021 7 1 自定義aqs實現 public class mylock public void setstate int state public thread getl...