【发布时间】:2013-04-10 13:09:34
【问题描述】:
刚刚查看了类 CopyOnWriteArrayList,我想知道为什么它的 get(...) 方法不需要任何同步。 add(...) 和 set(...) 方法使用 ReentrantLock 更改互斥块中的底层数组。但是 get(...) 只是返回原始的底层数组,没有任何同步。好的,底层数组被声明为 volatile:
private volatile transient Object[] array;
但我看不出使用 volatile 如何使任何同步变得多余。它只防止存储在数组中的引用被编译器缓存。如果我明白为什么这里不需要同步,我可以用比以前少一点的锁竞争来编写我的代码......
谢谢,奥利弗
【问题讨论】:
-
类名是一个提示。
-
@Mark Rotteveel:你是对的。谢谢。
-
@MarkRotteveel 我认为该线程中接受的答案错过了重要的一点。另一个答案更准确。
-
Mark Rotteveel 指出的 stackoverflow.com/questions/2950871/… 的重复
标签: java locking volatile java.util.concurrent