java - 可重入同步陷入无限循环

标签 java synchronization reentrancy

当存在可重入同步时,会进入无限循环并以 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/

相关文章:

C#/ASP.NET - Web 应用程序锁定

perl - 将变量插入数组是线程安全操作吗?

c# - 在扩展方法中使用 await 运算符时是否需要考虑可能的重入编码问题?

java - Android:如何使滑动到右侧屏幕并打开新 Activity 2

java - java for循环中递增int变量

java - 编译时出现 fatal error : invalid target release: 9

asp.net - ASP.NET Web 服务中的静态字段

java - Android Tabbed Activity,想太多了吗?

java - Java中实例方法同步的等价代码

java - Martin Odersky 演讲中 Scala 编译器早期实现中的可重入性和静态数据。它们有何关系?