在同一个对象上同步两次?

Oma*_*eji 49 java multithreading synchronization mutex

我想知道如果在同一个对象上同步两次,在Java中我会得到任何奇怪的行为吗?

方案如下

pulbic class SillyClassName {

    object moo;
    ...
    public void method1(){
        synchronized(moo)
        {
            ....
            method2();
            ....
        }
    }

    public void method2(){
        synchronized(moo)
        {
            doStuff();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

两种方法都使用该对象并在其上进行同步.第一种方法调用的第二种方法会因为它被锁定而停止吗?

我不这么认为,因为它是相同的线程,但我不确定可能发生的任何其他奇怪的结果.

Lei*_*igh 70

重入

同步块使用可重入锁,这意味着如果线程已经拥有锁,它可以毫无问题地重新获取它.因此,您的代码将按预期工作.

请参阅Java Tutorial页面底部的内部锁定和同步.

报价截至2015-01 ...

可重入同步

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