3

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

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

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

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

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

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

4

1 回答 1

2

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

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

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

这一章太长,无法完整引用,但我想强调一下这个具体的陈述

这种发生前排序不会与其他发生前排序传递关闭。

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

于 2020-01-24T16:45:03.687 回答