A store of a final field (inside a constructor) and, if the field is a reference, any store that this final can reference, cannot be reordered with a subsequent store (outside that constructor) of the reference to the object holding that field into a variable accessible to other threads. For example, you cannot reorder
时间: 2024-02-23 17:02:21 浏览: 96
写入 final 字段的操作(在构造函数内部),以及如果该字段是一个引用类型,则任何该 final 引用可以引用的对象的写入操作,都不能与将持有该字段的对象的引用存储到其他线程可访问的变量中(在构造函数外部)的操作进行重排序。
例如,您不能将以下代码进行重排序:
```java
class Example {
final int x;
Object y;
public Example() {
x = 1;
y = new Object();
}
public void publish() {
ExampleHolder.INSTANCE.set(this);
}
}
class ExampleHolder {
static Example INSTANCE;
static void set(Example e) {
INSTANCE = e;
}
}
```
在这个例子中,如果将 `INSTANCE` 的写入操作重排序到 `x` 和 `y` 的写入操作之前,那么在 `publish()` 方法被调用之前,其他线程可能会看到 `INSTANCE` 引用的对象的 `x` 和 `y` 字段为默认值,而不是构造函数中设置的值。这可能会导致程序出现不一致的行为。因此,Java 内存模型禁止这种重排序行为。
阅读全文