2015-09-08 74 views
0

當存在可重入同步時,它進入無限循環並以StackOverflow異常結束。可重入同步進入無限循環

下面的代碼首先打印「Outer」,然後繼續打印「Inner」。

有人能告訴我爲什麼是這種行爲?

public void outer() 
    { 
     synchronized (this) 
     { 
     System.out.println("Outer"); 
     inner(); 
     } 
    } 

    public void inner() 
    { 
     synchronized (this) 
     { 
     System.out.println("Inner"); 
     inner(); 
     } 
    } 

回答

2

您的錯誤與synchronize關鍵字無關。你繼續遞歸地調用一個方法而不返回。嘗試獲取同一對象上的鎖時,線程不會自行阻塞。您得到StackOverflowError,因爲您已經用盡了最大數量的堆棧幀來調用inner()。即使沒有同步,此行爲也會被複制