我在Java应用程序中运行多个线程,并且所有这些线程都需要访问相同的列表。但是,实际上只有一个线程需要插入/删除/更改列表,而其他线程仅需要访问它。

在其他线程中,我想复制列表以供我在需要阅读时使用,但是有没有办法以线程安全的方式做到这一点?如果我有一种方法可以逐个复制列表元素,并且列表已更改,那会搞砸了吗?

编辑:

该列表不会经常被删除,所以如果我只是正常地复制它并捕获到异常,它将起作用吗?如果该列表出现在副本的中间,而我却错过了它,那么它对功能的影响并不会真正改变

最佳答案

您可以将CopyOnWriteArrayList用于您的目的。

CopyOnWriteArrayList是Java 5并发API中引入的并发Collection类,以及Java中流行的表亲ConcurrentHashMap


  顾名思义,CopyOnWriteArrayList创建基础副本
  带有每个突变操作的ArrayList例如添加或设置。一般
  CopyOnWriteArrayList非常昂贵,因为它涉及昂贵的
  阵列复制包含所有写入操作,但如果您进行复制则非常有效
  有一个列表,其中迭代数量超过突变,例如你最需要
  迭代ArrayList,不要经常修改它。


使用此集合,您不应该每次都创建一个新实例。您应该只有一个对象,它将起作用。

07-24 09:46
查看更多