据我了解,新的Java内存模型要求对volatile变量的访问不能与对其他变量的访问重新排序,因此以下code是正确的:
Map configOptions;
char[] configText;
volatile boolean initialized = false;
// In Thread A
configOptions = new HashMap();
configText = readConfigFile(fileName);
processConfigOptions(configText, configOptions);
initialized = true;
// In Thread B
while (!initialized)
sleep();
// use configOptions
因此,当
initialized
设置为true
时,配置选项已经初始化,但是可见吗?我的意思是它已经在主存储器中了吗? 最佳答案
是。从Java 5开始,访问易失性变量会创建一个内存屏障,该屏障会有效地将所有缓存变量的副本与主内存进行同步。
这就是所谓的“同步搭载”,其中对非同步变量的写操作使用对其他某个变量的后续同步来用主存储器更新其值。
而且,对易失性的读/写很昂贵。不建议使用它来摆脱无限循环。如果不可避免,至少应在某处使用Thread.sleep()
。
参考文献:
Volatile piggyback. Is this enough for visiblity?