刚刚看了一下 CopyOnWriteArrayList 类,我想知道为什么它的 get(...) 方法不需要任何同步。add(...) 和 set(...) 方法使用 ReentrantLock 更改互斥块中的底层数组。但是 get(...) 只是返回原始的底层数组,没有任何同步。好的,底层数组被声明为 volatile:
private volatile transient Object[] array;
但我不明白使用 volatile 如何使任何同步变得多余。它只防止存储在数组中的引用被编译器缓存。如果我明白为什么这里不需要同步,我可以用比以前少一点的锁竞争来编写我的代码......
谢谢,奥利弗