当存在可重入同步时,会进入无限循环并以 StackOverflow 异常结束。
下面的代码首先打印“Outer”,然后继续打印“Inner”。
有人可以告诉我为什么会出现这种行为吗?
public void outer()
{
synchronized ( this)
{
System.out.println("Outer");
inner();
}
}
public void inner()
{
synchronized ( this)
{
System.out.println("Inner");
inner();
}
}
最佳答案
您的错误与synchronize
关键字无关。您继续递归调用方法而不返回。线程在尝试获取同一对象上的锁时不会阻塞自身。您会收到 StackOverflowError ,因为您已超出了调用 inner()
的最大堆栈帧数。即使没有同步,也会重现此行为
关于java - 可重入同步陷入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32453023/