据我所知,新的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
时,配置选项已经初始化,但它是否可见?我的意思是它已经存在于主存中了吗?
答案 0 :(得分:4)
是。从Java 5开始,访问volatile变量会创建一个内存屏障,有效地 将所有缓存变量 的副本与主内存同步。
这称为 Synchronization Piggybacking ,其中对非同步变量的写入使用其他变量的后续同步来更新其与主存储器的值。
此外,对volatile的读/写也很昂贵。不建议使用它来摆脱无限循环。如果它在某种程度上是不可避免的,至少在某处使用Thread.sleep()
。
答案 1 :(得分:1)
所以当initialized设置为true时,配置选项已经初始化,但它是否可见?
是。一旦你完成它volatile
对所有线程都可见,并从main memory
读取
根据{{3}}
Java编程语言允许线程访问共享变量(第17.1节)。通常,为了确保共享变量一致且可靠地更新,线程应确保通过获取锁定来独占使用此类变量,该锁定通常会对这些共享变量实施互斥。 字段可以声明为volatile,在这种情况下,Java Memory Model可以确保所有线程都看到变量的一致值(第17.4节)。 `