【发布时间】:2011-02-26 09:50:50
【问题描述】:
我查看了CopyOnWriteArrayList 的OpenJDK source code,似乎所有的写操作都受到同一个锁的保护,而读操作根本不受保护。据我了解,在 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 是线程安全的?
【问题讨论】:
标签: java data-structures concurrency java-memory-model