abh*_*aug 3 java static multithreading synchronized
我在某处读到:
如果静态同步方法位于不同的类中,则一个线程可以在每个类的静态同步方法内执行.每个类一个线程,无论它调用哪个静态同步方法.
假设我有以下类层次结构:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
1)如果我有以下两个函数调用:
Base.printBase();
Derived.printDerived();
Run Code Online (Sandbox Code Playgroud)
据我所知,他们不应该相互阻止,两者都可以同时执行.因为呼叫是用不同的类进行的.
2)但是,如果我有两个函数调用:
Derived.printBase();
Derived.printDerived();
Run Code Online (Sandbox Code Playgroud)
当它们在同一个类上调用时,它们应该被彼此阻塞.对?
或者还有更多的东西吗?
不,你在第2点描述的行为不是你会看到的.
同步对象取决于声明方法的位置,而不是取决于如何调用方法.从JLS 8.3.4.6开始:
对于类(静态)方法,使用与方法类的Class对象关联的监视器.
该"方法的类"这里Base.class的printBase,并Derived.class为printDerived.所以代码大致相当于:
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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,可以从不同的线程调用这两个方法,无论它们如何被调用,而不会相互阻塞.(当然,如果其中一个线程已经拥有监视器Derived.class,这将阻止不同的线程调用printDerived等 - 我只是在讨论这些方法如何相互交互.)
| 归档时间: |
|
| 查看次数: |
344 次 |
| 最近记录: |