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

标签 java multithreading static 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");
    }
}

1) 如果我有以下两个函数调用:

Base.printBase();
Derived.printDerived();

据我了解,它们不应相互阻塞,并且两者可以同时执行。因为调用是用不同的类进行的。

2) 但是,如果我有以下两个函数调用:

Derived.printBase();
Derived.printDerived();

它们应该被彼此阻塞,因为它们在同一个类上被调用。对吧?

或者还有更多的东西?

最佳答案

不,您在第 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.

这里的“方法类”是Base.class for printBaseDerived.class for 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");
        }
    }
}

所以这两个方法可以从不同的线程调用,而不管它们是如何调用的,而不会相互阻塞。 (当然,如果其中一个线程已经拥有 Derived.class 的监视器,这将阻止另一个线程调用 printDerived 等 - 我只是在谈论如何这些方法相互影响。)

关于java - java中继承下的同步静态方法行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28644499/

相关文章:

java - 替换不能使用枚举的 boolean 参数?

c++ - 资源密集型多线程杀死其他进程

c++ - 如何使用静态记录器设置不同的日志位置

c - C 中的全局变量是否是静态的?

java - .forward() 然后 resp.sendRedirect() 与 servlet

java - Git 存储库的正确密码存储

java - 如何避免Java中的 "package does not exist"错误

c++ - 如何在不需要消息循环的情况下使套接字访问行为为 'asynchronously'?

python - 发出信号会导致核心转储

c# - 字符串常量类应该是静态的吗?