同步方法以递归方式调用自身.这坏了吗?

Tho*_*hom 28 java recursion synchronized

这个问题的关键是要说明Java没有像我预期的那样工作.

您希望以下代码如何表现?

public class SynchTester {
  private static SynchTester synchTester;

  public synchronized static SynchTester getSynchTester(){
    if(synchTester==null){
      synchTester = new SynchTester();
    }

    return synchTester;
  }

  private SynchTester() {
    SynchTester myTester = getSynchTester();
  }

  public static void main(String[] args) {
    SynchTester tester = SynchTester.getSynchTester();
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望它挂起一个死锁等待递归完成,但它会抛出StackOverflow.显然,synchronized不会阻止访问同一个线程.

这是一个错误吗?

Dun*_*nes 72

在Java中,同步锁是可重入的.

回想一下,线程无法获取另一个线程拥有的锁.但是一个线程可以获得它已经拥有的锁.允许线程多次获取相同的锁可启用重入同步.这描述了一种情况,其中同步代码直接或间接地调用也包含同步代码的方法,并且两组代码使用相同的锁.在没有可重入同步的情况下,同步代码必须采取许多额外的预防措施,以避免线程导致自身阻塞.

来源:见本页底部