【问题标题】:When it's applicable to use CopyOnWriteArrayList [duplicate]当适用于使用 CopyOnWriteArrayList [重复]
【发布时间】:2017-10-22 12:33:40
【问题描述】:

我找不到关于何时适用于使用 CopyOnWriteArrayList 的任何解释,我的意思是容器最适合的情况。

有一个同名问题In what situations is the CopyOnWriteArrayList suitable?。但是,它已关闭,因为它与其他问题线程重复。我认为两个线程都没有回答这个问题,所以我启动了这个问题线程。

对于In what situations is the CopyOnWriteArrayList suitable?,它实际上说明CopyOnWriteArrayList

如果您有一个迭代次数超过突变的列表,则非常有效

但是我没有找到实际的应用场景。对于How can CopyOnWriteArrayList be thread-safe?,其实重点讲了 CompyOnWriteArrayList 是线程安全的原因。

提前感谢您的回答。

【问题讨论】:

  • @JoeC 感谢您的评论,但正如我上面提到的,我在“在什么情况下适合 CopyOnWriteArrayList”和它指向的另一个重复线程中都没有找到满意的答案。实际上,重复的线程“CopyOnWriteArrayList 如何是线程安全的?”确实是另一个故事。这就是我启动这个线程的原因。谢谢。
  • 那么请edit你的问题澄清为什么那里的答案没有回答你的问题,因为在我看来它确实如此。
  • @JoeC 谢谢,让我在问题中更清楚地澄清它。
  • 当您需要线程安全来处理相对较小的列表、更新率较低时,这是最好的选择。

标签: java multithreading


【解决方案1】:

基于javadoc,

java.util.ArrayList 的线程安全变体,其中所有可变的 操作(添加、设置等)是通过创建一个新的 底层数组的副本。

如您所见,对容器的任何修改都是昂贵的,尤其是当容器中的数据量很大时。

修改频率较低时最好使用CopyOnWriteArrayList。正如 JCIP 所建议的,

写时复制集合仅在以下情况下才合理使用 迭代远比修改更常见。

例如事件通知系统。每次需要通知事件时它都会迭代容器,但只会在观察者更改时进行修改。前者出现频率高,后者出现频率低。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2017-05-23
    • 2013-05-27
    相关资源
    最近更新 更多