gpt4 book ai didi

java - volatile 和更多线程

转载 作者:行者123 更新时间:2023-12-01 18:31:40 24 4
gpt4 key购买 nike

我正在尝试了解 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 变量时,它可以看到来自所有线程的所有变量。也许某种刷新所有缓存?如果不是,那么这样的 3 线程代码就被破坏了,对吗?

最佳答案

根据语言规范( http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.4 ):

A write to a volatile variable v (§8.3.1.4) synchronizes-with all subsequent reads of v by any thread (where "subsequent" is defined according to the synchronization order).

A write to a volatile field (§8.3.1.4) happens-before every subsequent read of that field.

因此, volatile 变量本身不会出现过时的缓存问题。你的问题是; “那么所有其他变量呢?”嗯,不, volatile 关键字仅影响其所在变量的缓存:这些线程上的所有其他变量都是不同步的。

关于java - volatile 和更多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23897699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com