首先鎖是針對線程的,即只有線程纔有鎖的概念。
什麼是可重入鎖呢?
當一個線程獲取了某個對象鎖以後,還可以再次獲得該對象鎖。
什麼時候我們會用到可重入鎖呢?
看下面的demo
public class Demo1 {
public synchronized void functionA(){
System.out.println("iAmFunctionA");
functionB();
}
public synchronized void functionB(){
System.out.println("iAmFunctionB");
}
}
代碼解釋
functionA()和functionB()都是同步方法,當線程進入funcitonA()會獲得該類的對象鎖,這個鎖"new Demo1()",在functionA()對方法functionB()做了調用,但是functionB()也是同步的,因此該線程需要再次獲得該對象鎖(new Demo1())。其他線程是無法獲該對象鎖的。
這就是可衝入鎖。
可重入鎖的作用就是爲了避免死鎖,java中synchronized和ReentrantLock都是可重入鎖
重入鎖的實現原理
通過爲每個鎖關聯一個請求計數器和一個獲得該鎖的線程。當計數器爲0時,認爲鎖是未被佔用的。線程請求一個未被佔用的鎖時,JVM將記錄該線程並將請求計數器設置爲1,此時該線程就獲得了鎖,當該線程再次請求這個鎖,計數器將遞增,當線程退出同步方法或者同步代碼塊時,計數器將遞減,當計數器爲0時,線程就釋放了該對象,其他線程才能獲取該鎖