【发布时间】:2019-11-25 16:56:37
【问题描述】:
我的问题适用于最初为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();
}
…
}
【问题讨论】:
-
你的 getName() 方法必须同步,这也是一个开销
-
@LeoLeontev 我不明白为什么必须同步
getName。 -
"name != null ?"也是开销。你确定 volatile 的开销更大吗? (我认为一些聪明的基准应该能够证明这一点)。
-
@Suma 我同意,我需要运行基准测试。
标签: java multithreading volatile