synchronized方法递归调用自己。 这是坏了?(Synchronized method

2019-07-03 12:40发布

这个问题的关键是要说明的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();
  }
}

我希望它与死锁等待递归来完成挂起,而是它抛出的StackOverflow。 显然,同步不会阻止访问相同的线程。

这是一个错误?

Answer 1:

在Java中,同步锁是折返 。

回想一下,一个线程不能获取由另一个线程拥有的锁。 但是,一个线程才能获取它已经拥有的锁 。 允许一个线程获得同样的锁不止一次使折返同步。 这描述了其中同步码,直接或间接的情况下,调用该还包含同步码的方法,以及代码两组使用相同的锁。 如果没有折返同步,同步码将不得不采取许多额外的预防措施,以避免具有螺纹原因本身阻止。

资料来源:见底部此页



Answer 2:

一个同步方法需要能够得到监控对象上的锁。 监视器对象是实例(或类为一个静态方法)。 已经有锁的线程并不需要再次得到它。 所以,是的,这可能导致一个计算器(harhar)。



Answer 3:

从Java教程 :

当一个线程正在执行的对象同步方法,来调用同步方法针对同一对象块(挂起执行),直到第一线程所有其他线程与该对象进行。

所以我觉得syncronized关键字担任预期,并同步递归调用是在java中完全合法的(和工作)。



文章来源: Synchronized method calls itself recursively. Is this broken?