2015-09-08 38 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()。即使没有同步,此行为也会被复制