当存在可重入同步时,它将进入无限循环并以StackOverflow异常结束。
以下代码打印"外部"首先,然后继续打印"内部"。
有人可以告诉我为什么会出现这种情况?
public void outer()
{
synchronized ( this)
{
System.out.println("Outer");
inner();
}
}
public void inner()
{
synchronized ( this)
{
System.out.println("Inner");
inner();
}
}
答案 0 :(得分:2)
您的错误与synchronize
关键字无关。你继续递归调用一个方法而不返回。尝试获取同一对象上的锁时,线程不会阻塞自身。你得到 StackOverflowError ,因为你已经用完了最大数量的堆栈帧来调用inner()
。即使没有同步