ReentrantLock中公平鎖與非公平鎖的區別

2021-09-12 15:31:25 字數 1186 閱讀 6010

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 ...