【发布时间】:2016-10-28 12:22:51
【问题描述】:
我有一个 ArrayList 'X',它被传递给多个线程,每个线程使用 addAll() 向这个 ArrayList 'X' 添加更多数据。显然这里存在多线程问题,一种选择是使代码的 addAll() 部分“同步”(或)使用 copyOnWriteArrayList。
但我的问题是,声明这个 ArrayList 'volatile' 会达到同样的目的吗? JVM 是否相应地对这些读/写指令进行排序并防止多线程问题?
【问题讨论】:
-
不,volatile 不会同步访问,这就是
synchronized(或其他锁)的用途。 -
Volatile 在这里帮不了你。 volatile 指的是引用而不是列表的内容。您应该使用
synchronized锁定列表或让每个线程维护自己的列表(如果可能)并在处理完成时将列表组合在一起。 -
我推荐阅读shipilev.net/blog/2016/close-encounters-of-jmm-kind/…(如果你有时间,可以阅读整篇文章)。
-
这个问题提供了一些更有用的信息:stackoverflow.com/questions/9749746/…
标签: java multithreading arraylist volatile copyonwritearraylist