java 中继承下的同步静态方法行为
Synchronized static methods behaviour under inheritance in java
我在某处读到:
如果静态同步方法位于不同的classes中,那么一个线程可以在每个class的静态同步方法中执行。每个 class 一个线程,无论它调用哪个静态同步方法。
假设我有以下 class 层次结构:
public class Base {
public static synchronized void printBase() {
System.out.println("Inside Base");
}
}
public class Derived extends Base {
public static synchronized void printDerived() {
System.out.println("Inside Derived");
}
}
1) 如果我有以下两个函数调用:
Base.printBase();
Derived.printDerived();
据我了解,它们不应相互阻塞,并且两者可以同时执行。由于使用不同的 classes 进行调用。
2) 但是如果我有以下两个函数调用:
Derived.printBase();
Derived.printDerived();
它们应该被彼此阻止,因为它们在同一个 class 上被调用。对吗?
或者还有更多内容?
不,您在第 2 点中描述的行为不是您将看到的。
同步对象取决于声明方法的位置,而不是调用方法。来自 JLS 8.3.4.6:
For a class (static) method, the monitor associated with the Class object for the method's class is used.
这里的"method's class"是printBase
的Base.class
,printDerived
的Derived.class
。所以代码大致等同于:
public class Base {
public static void printBase() {
synchronized (Base.class) {
System.out.println("Inside Base");
}
}
}
public class Derived extends Base {
public static void printDerived() {
synchronized (Derived.class) {
System.out.println("Inside Derived");
}
}
}
所以这两个方法可以从不同的线程调用,而不管它们是如何调用的,而不会相互阻塞。 (当然,如果其中一个线程已经拥有 Derived.class
的监视器,那将阻止另一个线程调用 printDerived
等——我只是在谈论这些方法如何相互交互。)
None两种情况都会导致线程阻塞。只有两个线程调用printBase
的情况才会造成阻塞。
第二种情况:
Derived.printBase();
Derived.printDerived();
Derived.printBase();
实际上是对Base.printBase();
.
的调用
我在某处读到:
如果静态同步方法位于不同的classes中,那么一个线程可以在每个class的静态同步方法中执行。每个 class 一个线程,无论它调用哪个静态同步方法。
假设我有以下 class 层次结构:
public class Base {
public static synchronized void printBase() {
System.out.println("Inside Base");
}
}
public class Derived extends Base {
public static synchronized void printDerived() {
System.out.println("Inside Derived");
}
}
1) 如果我有以下两个函数调用:
Base.printBase();
Derived.printDerived();
据我了解,它们不应相互阻塞,并且两者可以同时执行。由于使用不同的 classes 进行调用。
2) 但是如果我有以下两个函数调用:
Derived.printBase();
Derived.printDerived();
它们应该被彼此阻止,因为它们在同一个 class 上被调用。对吗?
或者还有更多内容?
不,您在第 2 点中描述的行为不是您将看到的。
同步对象取决于声明方法的位置,而不是调用方法。来自 JLS 8.3.4.6:
For a class (static) method, the monitor associated with the Class object for the method's class is used.
这里的"method's class"是printBase
的Base.class
,printDerived
的Derived.class
。所以代码大致等同于:
public class Base {
public static void printBase() {
synchronized (Base.class) {
System.out.println("Inside Base");
}
}
}
public class Derived extends Base {
public static void printDerived() {
synchronized (Derived.class) {
System.out.println("Inside Derived");
}
}
}
所以这两个方法可以从不同的线程调用,而不管它们是如何调用的,而不会相互阻塞。 (当然,如果其中一个线程已经拥有 Derived.class
的监视器,那将阻止另一个线程调用 printDerived
等——我只是在谈论这些方法如何相互交互。)
None两种情况都会导致线程阻塞。只有两个线程调用printBase
的情况才会造成阻塞。
第二种情况:
Derived.printBase();
Derived.printDerived();
Derived.printBase();
实际上是对Base.printBase();
.