为了账号安全,请及时绑定邮箱和手机立即绑定

happens-before规则和初始化安全规则之间的关系

happens-before规则和初始化安全规则之间的关系

牛魔王的故事 2023-09-27 15:23:37
我正在阅读《Java 并发实践》一书。在阅读有关 JMM 的章节时,它说:JMM 为程序中的所有操作定义了一个名为“happens-before”的部分排序。为了保证执行动作B的线程可以看到动作A的结果(无论A和B是否发生在不同的线程中), A和B之间必须存在happens-before关系。但是,我无法使用任何“发生前”规则来派生“初始化安全”规则:初始化安全保证对于正确构造的对象,所有线程都将看到构造函数设置的最终字段的正确值,无论对象如何发布。我们可以使用happens-before规则来推导“初始化安全”规则,还是这两个概念只是同一级别的抽象?
查看完整描述

1 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

“初始化安全规则”是一种特殊的规则,不能从其他的happens-before关系中推导出来,也不能与其他的happens-before关系结合起来派生出更多的规则。

该规则在JLS §17.5 最终字段语义中指定:

final字段还允许程序员无需同步即可实现线程安全的不可变对象。线程安全的不可变对象被所有线程视为不可变,即使使用数据争用在线程之间传递对不可变对象的引用也是如此。这可以提供安全保证,防止错误或恶意代码滥用不可变类。final必须正确使用字段以保证不变性。

该章太长,无法完整引用,但我想强调这一具体声明:

happens-before排序不会与其他happens-before排序传递地关闭。

因此,除了其他先发生关系之外,还存在“初始化安全规则”,以帮助构建不可变对象。


查看完整回答
反对 回复 2023-09-27
  • 1 回答
  • 0 关注
  • 67 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信