可重入鎖和不可重入鎖

2021-10-03 22:38:00 字數 1299 閱讀 4511

鎖就是把**塊、資源或資料(稱為臨界資源)鎖上,訪問臨界資源的時候只允許乙個執行緒去操作,其他執行緒必須等待或者放棄,這是為了保證最終程式的正確執行。

public

class

lock

islocked =

true;}

public

synchronized

void

unlock()

}

使用上面定義的lock鎖:

public

class

test

lock lock =

newlock()

;public

void

print()

throws interruptedexception

public

void

add(

)throws interruptedexception

}

這段程式執行會出現死迴圈。當呼叫print()方法的時候,執行緒獲取到鎖,然後呼叫add()方法,執行緒再次嘗試獲取鎖,被阻塞。add()方法要等print()方法執行結束才能獲取鎖,而print()方法要等add()方法執行結束才能釋放鎖,導致死鎖。

當呼叫print()方法時,獲得了鎖,在未釋放鎖之前,這個執行緒就不能再呼叫其他方法以及在其他方法中嘗試獲取鎖。這種鎖稱為不可重入鎖,也叫自旋鎖

public

class

lock

islocked =

true

; lockedby = thread;

lockedcount++;}

public

synchronized

void

unlock()

}}

當第乙個執行緒執行print()方法的時候,獲取到了鎖,lockedby等於該執行緒,該執行緒呼叫add()方法時,嘗試獲取鎖,islocked值為true,即鎖已經被占用,但是lockedby等於該執行緒,所以add()方法可以獲取鎖,lockedcount的值此時為2。當第二個執行緒執行print方法的時候,islocked值為true,並且lockedby不等於當前執行緒成立,因此進入等待狀態。這就是可重入鎖。

可重入鎖比不可重入鎖多了兩個屬性:lockedby表示鎖被哪個執行緒獲取,lockedcount表示乙個執行緒內,鎖被獲取到的次數。根據lockedby屬性,使當前執行緒的不同**塊可以獲取多次鎖,根據lockedcount屬性,執行真正釋放鎖的邏輯。

可重入鎖和不可重入鎖

當乙個執行緒獲得當前例項的鎖lock,並且進入了方法a,該執行緒在方法a沒有釋放該鎖的時候,是否可以再次進入使用該鎖的方法b?不可重入鎖 在方法a釋放鎖之前,不可以再次進入方法b 可重入鎖 在方法a釋放該鎖之前可以再次進入方法b 如reentrantlock和synchronized 不可重入鎖的實...

可重入鎖和不可重入鎖

可重入鎖就是可以迴圈迭代使用的鎖,不會產生死鎖的現象,典型的就是synchronized和reentrantlock。不可重入鎖迴圈迭代使用則有產生死鎖的風險。可重入鎖 class reentranttest implements runnable public synchronized void ...

可重入鎖 不可重入鎖

可重入鎖指的是可重複可遞迴呼叫的鎖,在外層使用鎖之後,在內層仍然可以使用,並且不發生死鎖 前提是同乙個物件或者類 note reentrantlock和synchronized都是可重入鎖 1 public class testlock 78 public synchronized void tes...