java-锁定获取顺序

使用以下代码,如果线程调用LoggingWidget.doSomething(),
线程必须经历的锁获取顺序是什么?
(即,它首先获取LoggingWidget的锁定,然后获取Widget的锁定吗?)

public class Widget {
   public synchronized void doSomething() {

   }
}

public class LoggingWidget extends Widget {
    public synchronized void doSomething() {
         System.out.println(toString() + ": calling doSomething");
         super.doSomething();
    }
}

解决方法:

在这种情况下,锁位于此锁上,因此只有一个锁,即实例.如果有多个实例,则每个实例都有一个完全独立的锁,无论它是Widget还是LoggingWidget.

让我换一种说法.您的代码在语义上等效于:

public class Widget {
  public void doSomething() {
    synchronized (this) {
      // do stuff
    }
  }
}

public class LoggingWidget extends Widget {
  public void doSomething() {
    synchronized (this) {
      System.out.println(toString() + ": calling doSomething");
      super.doSomething();
    }
  }
}

这些方法中只有一种被调用,因此只有一个锁.

上一篇:关于C#中的锁定对象


下一篇:java-为什么以下代码会导致死锁