Java 嵌套同步关键字

Java 嵌套同步关键字,java,synchronization,Java,Synchronization,我用Java编写了以下代码: public void doSomeThing() { synchronized (this) { doSomeThingElse(); } } public void doSomeThingElse() { synchronized (this) { // do something else } } 这个代码可以阻止吗?

我用Java编写了以下代码:

    public void doSomeThing() {
        synchronized (this) {
            doSomeThingElse();
        }
    }
    public void doSomeThingElse() {
        synchronized (this) {
            // do something else
        }
    }
这个代码可以阻止吗?我的意思是,这个代码可以永远等待吗?

作为可重入锁定的

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

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


不,不会出现死锁。

执行doSomething方法的线程已经获得锁,因此该线程可以执行doSomethingElse方法


您需要两个锁对象来创建死锁情况。在您的情况下,只有一个死锁,因此不可能创建死锁

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

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


编辑顺便说一句,它当然可以阻止。。。它将阻止任何不拥有同步对象的线程执行。但是,它不会(如公告所示)死锁。

同步在两种情况下都使用
因此,如果doSomeThing中的同步块运行,您就已经准备好了锁,以便可以执行doSomeThingElse方法

如果您的代码如此简单,则相当于:

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

您已经在第一次同步中使用了监视器锁。 您应该始终确保并发设计不会对性能造成巨大影响

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

假设现在您的代码看起来像这样

public void doSomeThing()
 {
  synchronized (this) 
   {             
    synchronized (this) 
     {             
      // do something else         
     }           
   }     
 }
然而,这是必需的

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

如果线程拥有此上的锁,它将进入其他同步方法/块,就像黄油中的热刀一样。

好吧,它应该正确运行。。如果不是,您应该发布所有必要的代码。他表示线程已经拥有secound方法所需的锁,因此它不会阻止自身。您是说代码[//执行其他操作]可以正确运行吗?我想,这里有代码块而不是注释。如果只有注释,则没有操作。如果没有任何代码,JVM甚至可能不会调用doSoemthinhElse方法。+1解释它至少需要两个锁来创建死锁。