Java 我可以从多线程的ArrayList中获取迭代器并安全地使用它们吗?

Java 我可以从多线程的ArrayList中获取迭代器并安全地使用它们吗?,java,multithreading,collections,thread-safety,Java,Multithreading,Collections,Thread Safety,我有一个由多个线程共享的ArrayList实例。它在一个同步块中初始化(因此有一个内存屏障使它对所有线程可见),所有线程只从中读取。ArrayList从不更改 我在网上读了很多帖子,但我仍然不清楚,无论我如何阅读,阅读是否安全。如果我在每个线程中从它获得一个迭代器,迭代器是否共享一些在迭代时被改变的状态,等等。我不共享迭代器,每个线程都有自己的迭代器 无论我如何进行读取,它是否对读取线程安全?只要每个线程都有自己的迭代器,就可以了 您唯一需要担心同步的时间是当一个线程正在修改(写入)共享数据结构

我有一个由多个线程共享的ArrayList实例。它在一个同步块中初始化(因此有一个内存屏障使它对所有线程可见),所有线程只从中读取。ArrayList从不更改

我在网上读了很多帖子,但我仍然不清楚,无论我如何阅读,阅读是否安全。如果我在每个线程中从它获得一个迭代器,迭代器是否共享一些在迭代时被改变的状态,等等。我不共享迭代器,每个线程都有自己的迭代器


无论我如何进行读取,它是否对读取线程安全?

只要每个线程都有自己的迭代器,就可以了

您唯一需要担心同步的时间是当一个线程正在修改(写入)共享数据结构,而其他线程正在从中读取时。这可能导致数据结构处于不一致的状态(想象一下,当调度程序突然切换到另一个线程时,线程没有完成修改)


当所有线程都在只读时,数据将永远不会处于不一致的状态,并且您不需要担心线程同步。

只要使用迭代器进行只读,这将按预期工作。迭代器也会快速失败,因为它可能会因以下原因引发ConcurrentModificationException:

  • 在多线程处理中,如果一个线程试图修改 当另一个线程在其上迭代时
  • 在单线程或多线程中,如果在创建 迭代器,则使用其自己的方法而不是 使用迭代器自己的方法

  • 只读总是线程安全的。共享迭代器可能不是线程安全的,因为每个迭代器都有状态,从迭代器读取会更改该状态,但如果每个线程都有自己的迭代器,那么它可能是正常的。@user3580294:
    …可能是正常的。
    这就是我问这个问题的原因。这是肯定的还是可能的?:)哦,很好,绝对没关系。只要您不共享正在更改的状态,也不更改共享的状态,您就可以了。所以不要使用
    迭代器#remove()
    。如果每个线程都有自己的迭代器,那么就可以了。你不能在线程之间共享一个迭代器,这对任何一个集合都适用吗?以您喜欢的任何方式阅读都是安全的?是的,这适用于任何收集/数据结构。