【发布时间】:2014-07-16 20:31:13
【问题描述】:
我正在尝试了解 volatile 关键字及其正确使用方法。看看 Brian Goetz 的文章Java theory and practice: Fixing the Java Memory Model,我被这个例子困住了:
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
上面的 volatile 变量用作“守卫”,表明一组共享变量已被初始化。
我知道,从 java 1.5 开始,volatile 足够强大,可以确保当线程 B 读取 volatile 变量时,它会看到线程 A 在线程 A 时可见的所有变量写入 volatile 变量。
但是如果有一个线程 C 做这样的事情呢:
// In Thread C
configOptions = new HashMap();
// put something to configOptions
我的问题:volatile 是否足够强大,以确保当线程 B 读取 volatile 变量时,它会看到来自所有线程的 all 变量。也许某种刷新所有缓存?如果不是,那么这种3线程的代码就坏了,对吧?
【问题讨论】:
-
您正在阅读 2004 年的一篇文章。此后内存模型发生了变化。
-
最好使用基于 Atmoic 的对象,例如 AtomicBoolean
-
我认为它在 2004 年发生了变化。
-
@Kayaman 自 Java 1.5 以来我还没有看到它发生变化。自 JSR 133 以来它发生了怎样的变化?我想我的更好的问题是,它是如何在 2004 年编写的使所提出的观点无效?
标签: java concurrency volatile