可以安全地在多线程中读取Java LinkedList吗?

时间:2012-07-25 23:06:06

标签: java

我希望多个线程遍历LinkedList中的元素。我不需要写入LinkedList。这样做是否安全?或者我是否需要同步列表才能使其正常工作?

谢谢!

2 个答案:

答案 0 :(得分:8)

他们可以安全地做到这一点,提供:

  • 他们在开始迭代之前与编写列表的(所有)线程同步,并且
  • 迭代期间没有线程修改列表。

第一点是必要的,因为除非在启动之前有正确的同步,否则其中一个“写入”线程可能会对本地高速缓存存储器或寄存器中的列表数据结构进行未刷新的更改,或者其中一个读取线程在其缓存或寄存器中具有过时的列表状态。

(这是需要深入了解Java内存模型以了解该场景是否真正是线程安全的情况之一。)


  

或者我是否需要同步列表才能使其正常工作

你不一定需要那么远。您需要做的就是确保在适当的时间点存在“先发生”关系,并且有多种方法可以实现这一点。例如,如果列表是由编写器线程创建和写入的,则编写器会在将列表调用start()之前将列表传递给读取器线程对象。

答案 1 :(得分:-1)

来自Java documentation

请注意,此实现未同步。如果多个线程同时访问链表,并且至少有一个线程在结构上修改了列表,则必须在外部进行同步。 (结构修改是添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这通常通过同步自然封装列表的某个对象来完成。如果不存在此类对象,则应使用集合“包装”列表。

换句话说,如果你真的只是迭代,那么你就没事了,只要小心。