【发布时间】:2014-04-08 10:12:12
【问题描述】:
我正在努力弄清楚如何将变量声明为
private volatile HashMap<Object, ArrayList<String>> data;
将在多线程环境中运行。
我的理解是volatile 表示从主内存而不是从线程缓存中获取。这意味着如果正在更新一个变量,在更新完成之前我不会看到新值并且我不会阻塞,而是我看到的是最后更新的值。 (这正是我想要的顺便说一句。)
我的问题是当我检索ArrayList<String> 并在线程B 正在读取时在线程A 中添加或删除字符串时,volatile 关键字究竟会影响什么?仅HashMap 还是将效果扩展到HashMap 的内容(K 和V)?即当线程 B 得到一个当前正在线程 A 中修改的 ArrayList<String> 时,实际返回的是在更新开始之前存在的 ArrayList<String> 的最后一个值。
为了清楚起见,假设更新添加了 2 个字符串。线程 B 获取数组时,线程 A 中已经添加了一个字符串。线程 B 是否按照添加第一个字符串之前的状态获取数组?
【问题讨论】:
-
请注意,
volatile与引用有关,而不是与被引用的Object有关。
标签: java multithreading volatile