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

Joh*_*oDo 2 java collections multithreading thread-safety

我有一个由多个线程共享的ArrayList实例.它在一个synchronized块中被初始化(所以有一个内存屏障使它对所有线程都可见)并且所有线程只从它读取.ArrayList永远不会改变.

我在线阅读了很多帖子,但是不管我怎么做,我都不清楚它是否可以安全阅读.如果我在每个线程中从它获得一个迭代器,那么迭代器会共享一些在迭代时会被改变的状态.我不会共享迭代器,每个线程都有它自己的.

无论我如何读取,读取的线程是否安全?

Mar*_*cny 6

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

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

当所有线程只读取时,数据永远不会处于不一致状态,您不必担心线程同步.