java中继承下的同步静态方法行为

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)

当它们在同一个类上调用时,它们应该被彼此阻塞.对?

或者还有更多的东西吗?

Jon*_*eet 8

不,你在第2点描述的行为不是你会看到的.

同步对象取决于声明方法的位置,而不是取决于如何调用方法.从JLS 8.3.4.6开始:

对于类(静态)方法,使用与方法类的Class对象关联的监视器.

该"方法的类"这里Base.classprintBase,并Derived.classprintDerived.所以代码大致相当于:

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等 - 我只是在讨论这些方法如何相互交互.)