volatile是否保证线程安全?这个ArrayList示例

时间:2016-06-26 11:02:26

标签: java multithreading arraylist volatile copyonwritearraylist

我有一个ArrayList' X'这被传递到多个线程,其中每个线程使用addAll()将更多数据添加到此ArrayList' X' X'使用addAll()。显然这里存在多线程问题,一个选项是使代码的addAll()部分同步化。 (或)使用copyOnWriteArrayList。

但我的问题是,将声明这个ArrayList' volatile'达到同样的目的? JVM是否相应地命令这些读/写指令并防止出现多线程问题?

2 个答案:

答案 0 :(得分:4)

  

会声明这个ArrayList'volatile'达到同样的目的吗?

你实际上不可能。当你写

volatile ArrayList list;

这会使list引用为volatile,而不是基础ArrayList。这也意味着你做的时候

list.add(x);

读取list,因此您只能获得读屏障而不是写屏障。

注意:这不会使操作成为原子,这是你真正需要的,但没有写入障碍,你甚至可能在另一个线程中看不到这个操作。

  

JVM是否相应地命令这些读/写指令并防止出现多线程问题?

它将相应地对读取进行排序,但不能用于避免在这种情况下出现多线程问题。即没有办法让它与volatile一起工作,更不用说假设JVM会做你想做的事而不用担心它。

通过比较可以正确使用

synchronized。你仍然可以弄错,这不是万无一失的,但你很有可能做到这一点。

答案 1 :(得分:0)

不,易变不会在这里工作。 Volatile关键字只是确保每个读取操作始终获得最新的更新值。在这里你需要使用synchronized。