我有一个ArrayList' X'这被传递到多个线程,其中每个线程使用addAll()将更多数据添加到此ArrayList' X' X'使用addAll()。显然这里存在多线程问题,一个选项是使代码的addAll()部分同步化。 (或)使用copyOnWriteArrayList。
但我的问题是,将声明这个ArrayList' volatile'达到同样的目的? JVM是否相应地命令这些读/写指令并防止出现多线程问题?
答案 0 :(得分:4)
会声明这个ArrayList'volatile'达到同样的目的吗?
你实际上不可能。当你写
volatile ArrayList list;
这会使list
引用为volatile,而不是基础ArrayList。这也意味着你做的时候
list.add(x);
读取list
,因此您只能获得读屏障而不是写屏障。
注意:这不会使操作成为原子,这是你真正需要的,但没有写入障碍,你甚至可能在另一个线程中看不到这个操作。
JVM是否相应地命令这些读/写指令并防止出现多线程问题?
它将相应地对读取进行排序,但不能用于避免在这种情况下出现多线程问题。即没有办法让它与volatile一起工作,更不用说假设JVM会做你想做的事而不用担心它。
通过比较可以正确使用 synchronized
。你仍然可以弄错,这不是万无一失的,但你很有可能做到这一点。
答案 1 :(得分:0)
不,易变不会在这里工作。 Volatile关键字只是确保每个读取操作始终获得最新的更新值。在这里你需要使用synchronized。