可重入鎖概念:this
當一個線程獲得一個對象鎖後,再次請求此對象時時能夠再次獲得該對象的鎖的,這也證實synchronized方法/塊的內部調用本類的其餘synchronized方法/塊時,時永遠能夠獲得鎖的。spa
public class Service { synchronized public void service1() { System.err.println("service1"); service2(); } synchronized public void service2() { System.err.println("service2"); service3(); } synchronized public void service3() { System.err.println("service3"); } }
public class SyncTest { public static void main(String[] args) { Service service = new Service(); service.service1(); } }
輸出結果以下:線程
運行結果說明:code
本身能夠再次獲取本身的內部鎖。好比有一條線程得到了某個對象多的鎖,此時這個對象鎖尚未釋放,當其再次想要獲取這個對象的鎖的時候仍是能夠獲取的,若是不可鎖重入的話就會形成死鎖對象
可重入鎖也支持父子類繼承的環境中:blog
父類建立繼承
public class Main { public int i = 10; public synchronized void operateMainMethon() { try { i--; System.err.println("main print i=" + i); Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } }
子類建立進程
public class Sub extends Main { public synchronized void operateSubMethon() { try { while (i > 0) { i--; System.err.println("sub print i=" + i); Thread.sleep(100); this.operateMainMethon(); } } catch (InterruptedException e) { e.printStackTrace(); } } }
結果以下:同步
結果說明:io
當存在父子類進程關係時,子類時徹底能夠經過"可重入鎖"調用父類的同步方法的