同步方法以递归方式调用自身。 这打破了吗?

这个问题的关键是要说明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。 显然,synchronized不会阻止访问同一个线程。

这是一个错误吗?

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

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

来源:见本页底部

同步方法需要能够锁定监视器对象。 monitor对象是实例(或静态方法的类)。 已经拥有锁的线程不需要再次获取它。 所以是的,这可能会导致stackoverflow(harhar)。

来自java教程 :

当一个线程正在为对象执行同步方法时,所有其他线程都会调用同一对象的同步方法(暂停执行),直到第一个线程完成对象为止。

所以我认为syncronized关键字按预期工作,并且同步递归调用在java中是完全合法的(并且正常工作)。