如何解决为什么在子类中同步超类的静态方法无效?
我正在阅读Doug Lea撰写的“ Java设计原理和模式中的并行编程”。他说:
与每个类关联的静态锁与任何类别的静态锁都不相关 其他类,包括其超类。添加一个无效 尝试保护的子类中的新静态同步方法 在超类中声明的静态字段。使用显式块版本 代替。
为什么无效?为什么显式块版本有效?
解决方法
为了保护超类静态字段,您需要一个公共锁。如果您编写修改超类字段的类,而其他人编写了影响超类字段的子类,则需要确保两个代码都引用相同的锁。如果它们各自锁定自己的子类,则不存在通用锁定,并且它们仍然可以相互干扰。这就是莉亚说的意思
与每个类关联的静态锁与任何其他类(包括其超类)的静态锁都不相关。
理想情况下,我们想对定义静态变量并保持所有内容封装的类进行锁定。显然,这种理想可能无法实现,子类可能必须定义锁定,但是需要对使用哪种锁定具有共同的策略。
如果您使用static synchronized
创建一个方法,那么它将获得您在其上定义该方法的类的锁。如果要保护的内容不在该类中,而在超类中,那么这不是您想要的,那么您想要获取声明了需要保护的字段的超类的锁。
指定正确的超类的方法是使用“显式块语法”,如下所示:
synchronized(Superclass.class) {
...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。