可重入鎖,synchronized和ReentrantLock都是可重入鎖,當一個線程執行到某個synchronized方法時,好比說method1,而在method1中會調用另一個synchronized方法method2,此時線程沒必要從新去申請鎖,而是能夠直接執行方法method2。由於如以前所說syncchronized所拿到的是調用該方法的對象的鎖是this鎖,即MyClass類的對象,因此調用method2不須要從新得到鎖。假如synchronized不具有可重入性,此時線程A須要從新申請鎖。可是這就會形成一個問題,由於線程A已經持有了該對象的鎖,而又在申請獲取該對象的鎖,這樣就會線程A一直等待永遠不會獲取到的鎖。 class MyClass {
public synchronized void method1() {
method2();
}
public synchronized void method2() {
}
}