ReentrantLock介紹和簡單使用

2021-10-06 06:12:58 字數 1614 閱讀 5227

reentrantlock和synchronized比較

(1)reentrantlock和synchronized都是獨佔鎖,前者需要主動的加鎖和釋放鎖,後者加鎖解鎖的過程會自動進行。

(2)reentrantlock和synchronized都是可重入的,前者加鎖和釋放鎖的次數必須一致,否則會一直進入等待,後者不必擔心最後是否釋放了鎖。

(3)reentranlock可以響應中斷,synchronized不能響應中斷,乙個執行緒獲取不到鎖就一直等待。

(4)reentrantlock可以實現公平鎖機制,就是等待時間最長的執行緒,可以優先獲取鎖。

(5)reentrantlock遇到異常不會釋放鎖,synchronized遇到異常會釋放鎖。

可重入概念

若乙個程式或子程式可以「安全的被並行執行(parallel computing)」,則稱其為可重入(reentrant或re-entrant)的。即當該子程式正在執行時,可以再次進入並執行它(並行執行時,個別的執行結果,都符合設計時的預期),可以被中斷的。

(1)簡單使用

public class demo 

public static void test() catch (interruptedexception e) finally

}}

(2)公平鎖(reentrantlock的引數為true)

public class demo 

public static void test() catch (exception e) finally }}

}

(3)非公平鎖(預設為false)

(4)響應中斷(lockinterruptibly)

public class demo  catch (interruptedexception e) 

thread1.interrupt();

try catch (interruptedexception e)

thread1.interrupted();

}public static void test1() catch (exception e)

}}

(1)如果發現該操作已經在執行中則不再執行(有狀態執行)trylock

(2)如果發現該操作已經在執行,等待乙個乙個執行(可公平鎖和非公平鎖,看具體需求)

(3)如果發現該操作已經在執行,則嘗試等待一段時間,等待超時則不執行(嘗試等待執行,trylock+時間)

(4)如果發現該操作已經在執行,等待執行。這時可中斷正在進行的操作立刻釋放鎖繼續下一操作。(lockinterruptibly())

(1)可以被中斷,說明reentrantlock不具備原子性

(2)lock.lock,優先考慮獲取鎖,在考慮響應中斷,lock.lockinterruptibly(),優先考慮響應中斷

(3)中斷不等於執行緒執行結束

(4)不要將獲取鎖的過程寫在try塊內,因為如果在獲取鎖時發生了異常,異常丟擲的同時,也會導致鎖無故被釋放

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