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