使用以下代码,如果线程调用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();
}
}
}
这些方法中只有一种被调用,因此只有一个锁.