嵌套同步关键字

我在Java中有这样的代码:

public void doSomeThing() { synchronized (this) { doSomeThingElse(); } } public void doSomeThingElse() { synchronized (this) { // do something else } } 

这个代码可以阻止吗? 我的意思是,这个代码可以永远等待吗?

正如Java文档描述的Reentrantlocking

一个线程可以获得它已经拥有的锁

第二个同步块使用相同的锁,因此将始终可用,因为锁已经在外部方法中获得了。

不,不会有僵局。

如果一个线程拥有这个锁,它会进入其他synchronized方法/块像黄油热刀。

在同步块中,您可以重新获得您已经拥有的锁。 locking提供程序(this)将被第一个线程获取以进入doSomething()。 然后在doSomethingElse()方法中它将重新获得它。

这样做的原因是什么? 那么没有什么可以说没有别的线程从其他地方进入doSomethingElse。 这将阻止任何代码执行doSomething()中的块,直到doSomethingElse()中的线程释放“this”。

编辑顺便说一句,它当然可以阻止…它会阻止任何不拥有同步对象的线程执行。 但它不会(像张贴)僵局。

锁已经被执行doSomething方法的线程占用,因此这个线程可以执行doSomethingElse方法。

你需要两个锁对象来创build死锁情况。 在你的情况下,只有一个,所以不可能造成死锁。

在这两种情况下同步使用,所以如果doSomeThing中的同步块运行,你已经有了锁,所以你可以执行doSomeThingElse方法。

如果你的代码如此简单,那就相当于:

 public synchronized void doSomeThing() { doSomeThingElse(); } public synchronized void doSomeThingElse() { // do something else } 

您已经在第一个同步监视器锁。 您应该始终确保并发devise不会对性能造成巨大影响。

确保这一点的一种方法是只同步所需的语句/代码。

现在让我们说你的代码看起来像这样。

 public void doSomeThing() { synchronized (this) { synchronized (this) { // do something else } } } 

而这是需要的

 public void doSomeThing() { doSomeThingElse(); } public void doSomeThingElse() { synchronized (this) { // do something else } }