reentrantlock:通過模板模式使用sync繼承了abstractqueuedsynchronizer(同步器)
,繼而又使用了fairsync,nonfairsync類來覆寫了sync的方法,
在使用reentrantlock時,通過構造方法確定使用公平鎖還是非公平鎖。
公平鎖與非公平鎖的差別主要在獲取鎖時:
公平鎖:
//首先直接呼叫acquire方法
final void lock()
//acquire為sync類的獲取鎖的核心方法
public final void acquire(int arg)
//tryacquire方法為公平鎖與非公平鎖的核心區別
protected final boolean tryacquire(int acquires)
} else if (current == getexclusiveownerthread())
return false;
}//非公平鎖
final void lock()
//非公平鎖的tryacquire方法
final boolean nonfairtryacquire(int acquires)
} //如果當前執行緒持有鎖,要再次競爭鎖,重入
else if (current == getexclusiveownerthread())
return false;
}
公平鎖與非公平鎖的區別點:
公平鎖:在lock()時,直接呼叫acquire(),
然後在tryacquire()時,首先判斷同步佇列是否為空,
如果為空,cas爭奪鎖,如果不為空,直接將當前執行緒包裝為節點入隊
優缺點:它保證了請求資源時間上的絕對順序,但是需要頻繁的上下文切換,開銷較大
非公平鎖:在lock()時嘗試獲取鎖,
在tryacquire()時,直接嘗試cas獲取鎖,與同步佇列進行鎖的競爭
優缺點:降低了一定的上下文切換,降低了效能開銷,但是可能剛釋放鎖的執行緒下次繼續獲取該鎖,可能導致其他執行緒永遠無法獲取到鎖,造成「飢餓現象」
reentrantlock預設使用的是非公平鎖哦,減少了一定的上下文切換,它保證了系統更大的吞吐量
ps:上下文切換:執行緒的阻塞與喚醒的切換,需要作業系統從使用者態到核心態開銷較大。
ReentrantLock實現同步
reentrantlock 也可以實現synchronized方法 塊的同步效果。reentrantlock 實現同步 如下 1 新建乙個service類 public class myservice public static void methodb 2 新建乙個測試類 public class...
ReentrantLock之unlock方法分析
public void unlock public final boolean release int arg return false release 1 嘗試在當前鎖的鎖定計數 state 值上減1。成功返回true,否則返回false。當然在release 方法中不僅僅只是將state 1這麼...
ReentrantLock 原理分析
public void lock 這是lock的原始碼,呼叫的其實是sync這個物件的lock函式,而sync是reentrantlock內部類sync的乙個物件例項,他有兩種實現nonfairsync 非公平鎖 和fairsync 公平鎖 先看公平鎖的lock函式 final void lock ...