【问题标题】:Why is it ineffective to synchronize statics of superclass in a subclass?为什么在子类中同步超类的静态信息无效?
【发布时间】:2020-10-07 20:46:39
【问题描述】:

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

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

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

【问题讨论】:

  • 第一句话解释了原因。
  • @Polygnome “无效”是什么意思?好像没有意义?他是在谈论在子类中重新定义具有相同行为的静态同步方法吗?如果是这样,那我明白了。
  • “无效”的意思是“不起作用”。

标签: java multithreading static


【解决方案1】:

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

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

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

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

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

synchronized(Superclass.class) {
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 2019-03-03
    相关资源
    最近更新 更多