为什么在子类中同步超类的静态是无效的?

hey*_*you 1 java static multithreading

我正在阅读 Doug Lea 所著的“Java 设计原则和模式中的并发编程”。他说:

与每个类相关联的静态锁与任何其他类(包括其超类)的静态锁无关。在试图保护超类中声明的静态字段的子类中添加新的静态同步方法是无效的。请改用显式块版本。

为什么无效?为什么显式块版本有效?

Nat*_*hes 8

为了保护超类静态字段,您需要一个通用锁。如果您编写修改超类字段的类,而其他人编写影响超类字段的子类,则您希望确保两段代码都引用相同的锁。如果它们都锁定在自己的子类上,则没有公共锁,它们仍然可以相互干扰。这就是 Lea 说的意思

与每个类相关联的静态锁与任何其他类(包括其超类)的静态锁无关。

理想情况下,我们希望在定义静态变量的类中进行任何需要的锁定,并将所有内容封装起来。显然,这个理想可能无法实现,子类可能必须定义锁定,但需要有一个关于使用什么锁的通用策略。

如果您创建一个方法,static synchronized那么它将获取您定义该方法的类的锁。如果您要保护的不在该类中,而是在超类中,那不是您想要的,您需要为声明需要保护的字段的超类获取锁。

指定正确超类的方法是使用“显式块语法”,如下所示:

synchronized(Superclass.class) {
    ...
}
Run Code Online (Sandbox Code Playgroud)