reentrantlock實現了lock,初始化時可選擇fairsync、nonfairsync。sync繼承了abstractqueuedsynchronizer。abstractqueuedsynchronizer的state:0表示未持有鎖、>=1表示持有鎖、>1表示鎖被重入。abstractqueuedsynchronizer用雙向鍊錶儲存搶占鎖的node(abstractqueuedsynchronizer的靜態內部類,存有前驅node、後繼node、執行緒)。
// reentrantlock裡的方法
public
void
lock()
// aqs裡的方法
public
final
void
acquire
(int arg)
private node addwaiter
(node mode)
}else
}}
final
boolean
acquirequeued
(final node node,
int arg)
// 前乙個節點不是頭節點或者獲取鎖失敗就判斷是否應掛起當前執行緒,應該掛起就掛起if(
shouldparkafte***iledacquire
(p, node)
) interrupted |=
parkandcheckinterrupt()
;}}catch
(throwable t)
}
private
static
boolean
shouldparkafte***iledacquire
(node pred, node node)
while
(pred.waitstatus >0)
; pred.next = node;
}else
return
false
;}
abstractqueuedsynchronizer的node的waitstatus預設是0。cancelled:1表示取消。signal:-1表示需要被喚醒。condition:-2表示在等待條件。propagate:-3表示下乙個獲取共享鎖的執行緒應該無條件傳播。
// 非公平方式嘗試獲取鎖
final
boolean
nonfairtryacquire
(int acquires)
}// 持有鎖的執行緒是當前執行緒
else
if(current ==
getexclusiveownerthread()
)return
false
;}
protected
final
boolean
tryacquire
(int acquires)
}else
if(current ==
getexclusiveownerthread()
)return
false;}
}
public
void
unlock()
public
final
boolean
release
(int arg)
return
false;}
protected
final
boolean
tryrelease
(int releases)
setstate
(c);
return free;
}private
void
unparksuccessor
(node node)
if(s != null)
// 喚醒下乙個節點或者從尾部開始不是被取消的節點的執行緒
locksupport.
unpark
(s.thread)
;}
ReentranLock重入鎖原始碼分析
今天來分析一下重入鎖的原始碼 重入鎖reentranlock是一種支援重進入的鎖,表示該鎖可以支援乙個執行緒對資源重複加鎖,並且分為公平鎖和非公平鎖 synchronized大家一定都很熟悉了,這也是一種隱式的重入鎖,是一種非公平鎖 當執行緒再次獲取鎖時,鎖需要先判斷該執行緒是否為當前佔據鎖的執行緒...
Synchronized可重入鎖分析
可重入鎖又稱遞迴鎖,是指在同乙個執行緒在外層方法獲取鎖的時候,再進入該執行緒的內層方法會自動獲取鎖 前提是鎖物件必須是同一物件或者class 不會因為之前已經獲取過還沒實方而發生阻塞。即同一執行緒可執行多個持有同乙個鎖的方法。先來一段 public class reentrantsynchroniz...
可重入鎖 不可重入鎖
可重入鎖指的是可重複可遞迴呼叫的鎖,在外層使用鎖之後,在內層仍然可以使用,並且不發生死鎖 前提是同乙個物件或者類 note reentrantlock和synchronized都是可重入鎖 1 public class testlock 78 public synchronized void tes...