在 Brian Goetz 的 Java Concurrency in Practice 中,有以下示例解释了 Java 中锁的可重入性:
public class Widget {
public synchronized void doSomething() {
...
}
}
public class LoggingWidget extends Widget {
public synchronized void doSomething() {
System.out.println(toString() + ": calling doSomething");
super.doSomething();
}
}
它表示由于 Java 中锁的可重入性,上述代码不会导致死锁,因为锁是基于每个线程而不是每个调用获得的。
但是,如果我们稍微扭曲一下这个例子:
public class XYZ {
public synchronized void someFunction() {
...
}
}
public class SomeClass {
private XYZ xyz;
...
public synchronized void functionCalled() {
...
xyz.someFunction();
}
}
我们调用了SomeClass的functionCalled(),在SomeClass的对象上获得了锁。现在,将调用 someFunction() 或换句话说,线程将进入 xyz 类的 someFunction() 。 XYZ 类的同步函数会要求锁定 XYZ 类的对象吗?我有一点困惑。请澄清。
最佳答案
是的,上面的代码将要求锁定 SomeClass
和 xyz
对象。然而,这不会导致任何问题。
xyz
对象是private
,因此任何线程都不可能在调用functionCalled() 之前首先锁定
,因此不会出现死锁,因为这里的两个锁总是按照xyz
SomeClass
-> xyz
的顺序调用。
关于java - 下面的代码会执行成功吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52300948/