【问题标题】:Relationship between happens-before rules and initialization safety rule发生前规则与初始化安全规则的关系
【发布时间】:2020-02-03 14:38:44
【问题描述】:

我正在阅读Java Concurrency in Practice 的书。

在阅读有关 JMM 的章节时,它说:

JMM 为程序中的所有操作定义了一个称为发生前发生的偏序。为了保证执行动作 B 的线程可以看到动作 A 的结果(无论 A 和 B 是否发生在不同的线程中),A 和 B 之间必须有 happens-before 关系。 p>

但是,我不能使用任何发生前的规则来推导“初始化安全”规则:

初始化安全保证对于正确构造的对象,所有线程都将看到构造函数设置的最终字段的正确值,而不管对象是如何发布的。

我们可以使用happens-before规则来推导出“初始化安全”规则,还是这两个概念只是同一级别的抽象?

【问题讨论】:

  • “我们可以使用happens-before 规则来导出“初始化安全”规则吗?” - 该规则本身引入了所描述的动作之间的happens-before 关系。这就像一个公理:不需要推导它。

标签: java final happens-before


【解决方案1】:

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

规则在JLS §17.5, final Field Semantics中指定:

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

章节太长,无法完整引用,但我想强调一下this specific statement

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 2012-06-08
    • 2018-07-31
    • 2018-10-19
    • 2019-07-05
    • 2016-06-27
    • 1970-01-01
    相关资源
    最近更新 更多