//加鎖從 先看一下 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...