我想知道如果在同一个对象上同步两次,在Java中我会得到任何奇怪的行为吗?
方案如下
pulbic class SillyClassName { object moo; ... public void method1(){ synchronized(moo) { .... method2(); .... } } public void method2(){ synchronized(moo) { doStuff(); } } }
两种方法都使用该对象并在其上进行同步.第一种方法调用的第二种方法会因为它被锁定而停止吗?
我不这么认为,因为它是相同的线程,但我不确定可能发生的任何其他奇怪的结果.
同步块使用可重入锁,这意味着如果线程已经拥有锁,它可以毫无问题地重新获取它.因此,您的代码将按预期工作.
请参阅Java Tutorial页面底部的内部锁定和同步.
报价截至2015-01 ...
可重入同步
回想一下,线程无法获取另一个线程拥有的锁.但是一个线程可以获得它已经拥有的锁.允许线程多次获取相同的锁可启用重入同步.这描述了一种情况,其中同步代码直接或间接地调用也包含同步代码的方法,并且两组代码使用相同的锁.在没有可重入同步的情况下,同步代码必须采取许多额外的预防措施,以避免线程导致自身阻塞.