の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 のように並べ替えられると、配列が矛盾した状態になる可能性があることを意味します。
CopyOnWriteArrayList
JMM の理解が間違っているのでしょうか、それともスレッドセーフである理由について他に何か説明はありますか?