可重入鎖和非重入鎖

2021-10-24 11:26:40 字數 823 閱讀 6179

首先來解釋一下什麼叫做可重入鎖;

可重入鎖就是可以重入的鎖;比如有乙個執行緒訪問乙個類中的普通方法時;獲取到了臨界資源,持有鎖;那麼在執行該方法中時,其內層呼叫方法也需要獲取同樣的鎖;那麼內層方法就會自動獲取鎖;

舉乙個例子:

synchronized

void seta (

)throws exception

synchronized

void setb (

)throws exception

執行緒搶到了鎖去執行方法a;在方法a中又呼叫了方法b;由於b方法是在a中被呼叫的,並且該執行緒持有執行a方法所需要的鎖;因此在執行方法b的時候就自動獲取鎖;去執行方法b;

可重入鎖可以避免執行緒死鎖也可以從上述舉例**中看出來;

假如synchronized不是可重入鎖;那麼該執行緒獲取到執行a方法所需要的鎖之後開始執行a方法;但是在執行過程中遇到了方法b;由於是不可重入鎖;b方法也是被synchronized關鍵字修飾;所以執行b方法也需要獲取鎖;但是此時a方法**還未執行完成,繼續占有鎖;b方法就獲取不到鎖,被阻塞;a方法遲遲執行不完成,所以也就一直不釋放鎖;因此;就產生了死鎖

synchronized和reentrantlock都是可重入鎖;當然reentrant還可以設定成為公平性鎖,也就是不可重入鎖;synchronized只是可重入鎖,也就是不公平的鎖

那麼不可重入鎖就很容易理解啦

所謂不可重入鎖,即若當前執行緒執行某個方法已經獲取了該鎖,那麼在方法中嘗試再次獲取鎖時,就會獲取不到被阻塞。

可重入鎖和不可重入鎖

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

可重入鎖和不可重入鎖

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

可重入鎖和不可重入鎖

鎖就是把 塊 資源或資料 稱為臨界資源 鎖上,訪問臨界資源的時候只允許乙個執行緒去操作,其他執行緒必須等待或者放棄,這是為了保證最終程式的正確執行。public class lock islocked true public synchronized void unlock 使用上面定義的lock鎖...