Java CopyOnWriteArrayList仅适用于迭代,不适用于随机访问读取

Java CopyOnWriteArrayList仅适用于迭代,不适用于随机访问读取,java,collections,copyonwritearraylist,Java,Collections,Copyonwritearraylist,我在问题帖上看到以下评论: 因为CopyOnWriteArrayList用于安全遍历。使用它的成本是为每次修改复制底层引用数组,并可能保留多个副本,以便线程在结构的过时版本上迭代。ReadWriteLock允许多个读卡器,但仍允许偶尔的编写器执行必要的修改 我刚刚开始学习CopyOnWriteArrayList,有人能详细说明一下上面的语句是什么意思吗?随机访问读取而不是迭代,如何使ReadWriteLock成为更好的选项?当您使用迭代器遍历CopyOnWriteArrayList时,调用迭代器

我在问题帖上看到以下评论:

因为CopyOnWriteArrayList用于安全遍历。使用它的成本是为每次修改复制底层引用数组,并可能保留多个副本,以便线程在结构的过时版本上迭代。ReadWriteLock允许多个读卡器,但仍允许偶尔的编写器执行必要的修改


我刚刚开始学习CopyOnWriteArrayList,有人能详细说明一下上面的语句是什么意思吗?随机访问读取而不是迭代,如何使ReadWriteLock成为更好的选项?

当您使用迭代器遍历CopyOnWriteArrayList时,调用迭代器时会得到列表的快照,将来的修改不会影响快照,因此从调用迭代器开始,您将始终循环遍历数据副本


对于随机访问循环,它将从列表的当前新副本获取数据。如果发生某些修改,未来的随机访问将读取修改后的列表,并可能导致一些同步问题。因此,ReadWriteLock将有助于确保遍历线程的安全。

CopyOnWriteArrayList的迭代可能需要很长时间,因此根据您的使用情况,在迭代时可能需要进行大量修改。对于一致的结果,您只需继续迭代开始迭代时的旧版本。随机访问只需片刻,因此不会留下旧版本。但是两个随机访问可能不会访问同一个版本,它们之间总会有一个写操作。例如,访问相邻索引可能不会给您提供相邻元素。注释已被删除。这可能意味着写这篇文章的人会后悔写了这篇文章。但这并不是说CopyOnWriteArrayList不适合随机访问读取,或者ReadWriteLock是一个更好的选择。这只是说,如果您不需要进行遍历,那么这是一个选项。最好的选择取决于列表的大小、更新频率、预期的读取性能,以及您是否需要CopyOnWriteArrayList的特定保证迭代语义。这不是一个简单的经验法则。