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

Java 为什么在子类中同步超类的静态是无效的?,java,multithreading,static,Java,Multithreading,Static,我正在阅读Doug Lea的“Java设计原则和模式中的并发编程”。他说: 与每个类关联的静态锁与任何类的静态锁无关 其他类,包括其超类。添加一个 尝试保护的子类中的新静态同步方法 在超类中声明的静态字段。使用显式块版本 相反 为什么无效?为什么显式块版本有效?为了保护超类静态字段,您需要一个公共锁。如果您编写的类修改了超类字段,而其他人编写的子类影响了超类字段,那么您需要确保两段代码引用相同的锁。如果它们各自锁在自己的子类上,则没有公共锁,它们仍然可以相互干扰。这就是Lea说的意思 与每个类关

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

与每个类关联的静态锁与任何类的静态锁无关 其他类,包括其超类。添加一个 尝试保护的子类中的新静态同步方法 在超类中声明的静态字段。使用显式块版本 相反


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

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

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

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

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

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

synchronized(Superclass.class) {
    ...
}

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

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

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

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

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

synchronized(Superclass.class) {
    ...
}

第一句解释了为什么。@polygenme他所说的“无效”是什么意思?好像没什么意义?他说的是用子类中相同的行为重新定义静态同步方法吗?如果是这样的话,我就明白了。“无效”意味着“它不起作用”。第一句解释了原因。@Polygenome他所说的“无效”是什么意思?好像没什么意义?他说的是用子类中相同的行为重新定义静态同步方法吗?如果是这样的话,我理解,“无效”意味着“无效”。