ReentrantLock 的簡單分析

2021-10-08 09:10:49 字數 3263 閱讀 1136

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方法的前後分 別是falsetrue

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,不能就立即返回falsetrylock(long timeout,timeunit unit),可以增加時間限制,如果超過該時間段還沒獲得鎖,返回false

lock能獲得鎖就返回true,不能的話一直等待獲得鎖 。

locklockinterruptibly,如果兩個執行緒分別執行這兩個方法,但此時中斷這兩個執行緒,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這麼...