gpt4 book ai didi

java - 为什么CopyOnWriteArrayList.get不需要同步?

转载 作者:行者123 更新时间:2023-11-30 04:25:35 27 4
gpt4 key购买 nike

刚刚查看了类 CopyOnWriteArrayList,我想知道为什么它的 get(...) 方法不需要任何同步。 add(...) 和 set(...) 方法使用 ReentrantLock 更改互斥 block 中的底层数组。但是 get(...) 只是返回原始的底层数组,没有任何同步。好的,底层数组被声明为 volatile:

private volatile transient Object[] array;

但我不明白使用 volatile 如何使任何同步变得多余。它仅防止编译器缓存存储在数组中的引用。如果我理解为什么这里不需要同步,我可以用比以前更少的锁争用来编写代码......

谢谢,奥利弗

最佳答案

线索就在名字中(正如 MarkRotteveel 指出的那样)。

当进行任何更改时,更改是在单独的Object[]中进行的,然后整个批处理都会被复制 - “写入时复制”。

由于当引用从旧的 Object[] 更改为新的 Object 时,内部 Object[] volatile []所有线程都会接受更改。

关于java - 为什么CopyOnWriteArrayList.get不需要同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15926794/

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