クラス CopyOnWriteArrayList を見て、その get(...) メソッドが同期を必要としない理由を知りました。add(...) および set(...) メソッドは、ReentrantLock を使用してミューテックス ブロック内の基になる配列を変更します。しかし、 get(...) は、同期せずに生の基になる配列を返すだけです。さて、基になる配列は volatile と宣言されています。
private volatile transient Object[] array;
しかし、揮発性を使用すると同期が冗長になる方法がわかりません。配列に格納された参照がコンパイラによってキャッシュされるのを防ぐだけです。ここで同期が必要ない理由を理解していれば、以前よりもロックの競合が少し少ないコードを書くことができます...
ありがとう、オリバー