gpt4 book ai didi

java - 混合 volatile 和非 volatile

转载 作者:行者123 更新时间:2023-12-02 08:00:36 29 4
gpt4 key购买 nike

我的问题适用于最初为 null 的字段,然后初始化为非 null 值,然后不再更改。

由于该字段需要尽快可供所有线程使用,因此我需要使用 volatile

但是,如果我想尽可能避免 volatile 访问的开销(即当非 volatile 字段就足够时),下面的代码有意义吗?

public class User {
private String nonVolatileName;
private volatile String volatileName;

public String getName() {
final String name = nonVolatileName;
return name != null ? name : volatileName;
}

private void initName() {
volatileName = nonVolatileName = expensiveComputation();
}


}

最佳答案

是的,代码会起作用,因为“对 volatile 字段(§8.3.1.4)的写入发生在该字段的每次后续读取之前。” [1]

return name != null ? name : volatileName;

因此,只要name == null,您将强制读取 volatile 变量,直到它不为空(即expenseComputation已完成),这会发生这种情况before 语义确保您从那时起就可以在 nonVolatileName 中看到非 null 值。另请参见此处 [2]

向你的同事解释这一点很有趣

[1] https://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.5-320

[2] Volatile variables and other variables

关于java - 混合 volatile 和非 volatile ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59036669/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com