CopyOnWriteArrayList如何做到线程安全?
我已经查看了CopyOnWriteArrayList的OpenJDK
源代码,似乎所有写入操作都受到相同锁的保护,而读取操作根本不受保护。据我所知,在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 的理解中,这意味着如果语句 1-4 像 1-2(new)-4-2(copyOf)-3 一样重新排序,则可能会观察到数组处于不一致的状态。get
我是否错误地理解了 JMM,或者对于为什么线程安全还有其他解释?CopyOnWriteArrayList