のOpenJDK ソース コードを調べたCopyOnWriteArrayListところ、すべての書き込み操作は同じロックで保護されており、読み取り操作はまったく保護されていないようです。私が理解しているように、JMM では、変数へのすべてのアクセス (読み取りと書き込みの両方) をロックで保護する必要があります。そうしないと、並べ替え効果が発生する可能性があります。
たとえば、set(int, E)メソッドには次の行が含まれています (ロックされています)。
/* 1 */ int len = elements.length;
/* 2 */ Object[] newElements = Arrays.copyOf(elements, len);
/* 3 */ newElements[index] = element;
/* 4 */ setArray(newElements);
一方get(int)、メソッドはreturn get(getArray(), index);.
JMM についての私の理解では、これは、getステートメント 1 ~ 4 が 1-2(new)-4-2(copyOf)-3 のように並べ替えられると、配列が矛盾した状態になる可能性があることを意味します。
CopyOnWriteArrayListJMM の理解が間違っているのでしょうか、それともスレッドセーフである理由について他に何か説明はありますか?