我希望多个线程遍历 LinkedList 中的元素。我不需要写入 LinkedList。这样做安全吗?还是我需要一个同步列表才能使其工作?
谢谢!
他们可以安全地做到这一点,前提是:
第一点是必要的,因为除非在开始之前进行了适当的同步,否则有可能其中一个“写入”线程对本地缓存或寄存器中的列表数据结构进行了未刷新的更改,或者一个读取线程有缓存或寄存器中的陈旧列表状态。
(这是需要深入了解 Java 内存模型才能知道该场景是否真正线程安全的情况之一。)
或者我是否需要一个同步列表才能使其工作
你不一定需要走那么远。您需要做的就是确保在适当的时候存在“之前发生”的关系,并且有多种方法可以实现这一点。例如,如果列表是由写线程创建和写入的,然后写线程在调用start()
它们之前将列表传递给读线程对象。
从Java 文档:
请注意,此实现不同步。如果多个线程同时访问一个链表,并且至少有一个线程在结构上修改了链表,则必须对外同步。(结构修改是添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这通常是通过同步一些自然封装列表的对象来完成的。如果不存在这样的对象,则应使用集合“包装”列表。
换句话说,如果你真的只是在迭代,那么你就没事了,只是要小心。