gpt4 book ai didi

java - CopyOnWriteArrayList 的行为

转载 作者:太空狗 更新时间:2023-10-29 22:55:10 25 4
gpt4 key购买 nike

CopyOnWriteArrayList 的 Javadocs 说

A thread-safe variant of ArrayList in which all mutative operations (add, set, and so on) are implemented by making a fresh copy of the underlying array.

我现在很困惑,其他线程什么时候才能看到这个新副本中存在的变化?这是否意味着底层数组的副本数等于集合的突变数?如果不是这样,这些单独副本的更改何时传输到底层数组以便其他线程可以看到它们?

最佳答案

这里的想法是,每当您向 CopyOnWriteArrayList 添加或删除时,基本数组都会随修改一起复制。

Does this mean there will be number of copies of the underlying array equal to the number of mutations of the collection

是的,对于更新 ArrayList 的每个线程,持有旧副本的所有其他线程本质上都将引用不同的数组。

when are the changes of these individual copies are transferred to underlying array so that other threads can see them?

您当前正在查看的数组(比方说您的迭代器)永远不会改变。当你从一个数组中读取时,你正在读取它,就像你开始读取时一样。如果 CopyOnWriteArrayList 被另一个线程更改,您当前正在观察的数组将不会受到影响。

要获得最新版本,请重新阅读 list.iterator();

也就是说,大量更新此集合会降低性能。如果您尝试对 CopyOnWriteArrayList 进行排序,您将看到该列表抛出一个 UsupportedOperationException(排序调用集合上的设置 N 次)。当您进行超过 90+% 的读取时,您应该只使用此读取。

关于java - CopyOnWriteArrayList 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4227827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com