我的问题适用于一个最初为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
必须同步。 - Julien Royer