reentantlock
繼承介面lock
並實現了介面中定義的方法,他是一種可重入鎖,除了能完 成synchronized
所能完成的所有工作外,還提供了諸如可響應中斷鎖、可輪詢鎖請求、定時鎖等 避免多執行緒死鎖的方法。
void lock()
: 執行此方法時, 如果鎖處於空閒狀態, 當前執行緒將獲取到鎖. 相反, 如果鎖已經 被其他執行緒持有, 將禁用當前執行緒, 直到當前執行緒獲取到鎖.。
boolean trylock()
:如果鎖可用, 則獲取鎖, 並立即返回 true, 否則返回 false. 該方法和 lock()的區別在於, trylock()只是"試圖"獲取鎖, 如果鎖不可用, 不會導致當前執行緒被禁用, 當前執行緒仍然繼續往下執行**. 而 lock()方法則是一定要獲取到鎖, 如果鎖不可用, 就一 直等待, 在未獲得鎖之前,當前執行緒並不繼續向下執行.。
void unlock()
:執行此方法時, 當前執行緒將釋放持有的鎖. 鎖只能由持有者釋放, 如果執行緒 並不持有鎖, 卻執行該方法, 可能導致異常的發生.。
condition newcondition()
:條件物件,獲取等待通知元件。該元件和當前的鎖繫結, 當前執行緒只有獲取了鎖,才能呼叫該元件的await()
方法,而呼叫後,當前執行緒將縮放鎖。
getholdcount()
:查詢當前執行緒保持此鎖的次數,也就是執行此執行緒執行lock
方法的次 數。
getqueuelength()
:返回正等待獲取此鎖的執行緒估計數,比如啟動 10 個執行緒,1 個 執行緒獲得鎖,此時返回的是 9 7。
getwaitqueuelength
:(condition condition
)返回等待與此鎖相關的給定條件的線 程估計數。比如 10 個執行緒,用同乙個condition
物件,並且此時這 10 個執行緒都執行了condition
物件的await
方法,那麼此時執行此方法返回 10 。
haswaiters
(condition condition
):查詢是否有執行緒等待與此鎖有關的給定條件 (condition
),對於指定contidion
物件,有多少執行緒執行了condition.await
方法 。
hasqueuedthread(thread thread)
:查詢給定執行緒是否等待獲取此鎖 。
hasqueuedthreads()
:是否有執行緒等待此鎖 。
isfair()
:該鎖是否公平鎖 。
isheldbycurrentthread()
: 當前執行緒是否保持鎖鎖定,執行緒的執行lock
方法的前後分 別是false
和true
。
islock()
:此鎖是否有任意執行緒占用 。
lockinterruptibly()
:如果當前執行緒未被中斷,獲取鎖 。
trylock()
:嘗試獲得鎖,僅在呼叫時鎖未被執行緒占用,獲得鎖 。
trylock(long timeout timeunit unit)
:如果鎖在給定等待時間內沒有被另乙個執行緒保持, 則獲取該鎖。
jvm 按隨機、就近原則分配鎖的機制則稱為不公平鎖,reentrantlock
在建構函式中提供了 是否公平鎖的初始化方式,預設為非公平鎖。非公平鎖實際執行的效率要遠遠超出公平鎖,除非 程式有特殊需要,否則最常用非公平鎖的分配機制。
公平鎖指的是鎖的分配機制是公平的,通常先對鎖提出獲取請求的執行緒會先被分配到鎖, reentrantlock 在建構函式中提供了是否公平鎖的初始化方式來定義公平鎖。
reentrantlock
通過方法lock()
與unlock()
來進行加鎖與解鎖操作,與synchronized
會 被 jvm 自動解鎖機制不同,reentrantlock
加鎖後需要手動進行解鎖。為了避免程式出 現異常而無法正常解鎖的情況,使用reentrantlock
必須在finally
控制塊中進行解鎖操 作。
reentrantlock
相比synchronized
的優勢是可中斷、公平鎖、多個鎖。這種情況下需要 使用reentrantlock
。
public
class
myservice
}catch
(interruptedexception e)
finally
}}
condition
類的awiat
方法和object
類的wait
方法等效 。
condition
類的signal
方法和object
類的notify
方法等效 。
condition
類的signalall
方法和object
類的notifyall
方法等效 。
condition
類可以喚醒指定條件的執行緒,而object
的喚醒是隨機的 。
trylock
能獲得鎖就返回true
,不能就立即返回false
,trylock(long timeout,timeunit unit)
,可以增加時間限制,如果超過該時間段還沒獲得鎖,返回false
。
lock
能獲得鎖就返回true
,不能的話一直等待獲得鎖 。
lock
和lockinterruptibly
,如果兩個執行緒分別執行這兩個方法,但此時中斷這兩個執行緒,lock
不會丟擲異常,而lockinterruptibly
會丟擲異常。
對ReentrantLock的認識?
顧名思義,reentrantlock是重入鎖。它實現了lock介面,是基於aqs 一種用於構建同步器的框架 構造出來的一種同步器。同synchronized一樣,reentrantlock也是可重入的,與synchronized相比增加了一些高階功能,主要有以下三項 等待可中斷 可實現公平鎖 鎖可以...
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這麼...