【发布时间】:2017-10-31 07:56:58
【问题描述】:
几乎所有 CopyOnWriteArrayList 中的方法都使用 getArray() 直接调用数组。这种行为有原因吗? 例如:
public int size() {
return getArray().length;
}
或
public int indexOf(Object o) {
Object[] elements = getArray();
return indexOf(o, elements, 0, elements.length);
}
【问题讨论】:
-
@AxelH 它没有。这是一个简单的包私有最终方法,带有
return array;。可能是一些与 JMM 相关的优化之类的。 -
我确实说过这是一个一般性答案 ...我没有提到这个具体案例。但是,如果由于任何原因需要更新类,并发性,不变性,......这将更简单在
getArray中执行此操作,而不是使用数组的每个方法。所以我猜这个方法的开发者有点偏执 -
@AxelH 该类是 Doug Lea 的
java.util.concurrent的一部分。这很可能有一个很好的理由。 -
@Kayaman 副本并没有真正回答问题,直接在现场操作会达到完全相同的效果。解释的“巫毒”与调用
getArray和/或setArray无关。 -
参见stackoverflow.com/questions/28772539/… 以讨论相关的
setArray()方法。它是内存模型巫毒,可能与编译器/JIT/其他优化有关,不幸的是,Doug Lea 没有对代码进行评论,具体原因。但是,它们肯定是有目的的,它与直接访问数组不同。链接问题中的 Stuart Marks 是从事 Java 内存模型和相关工作的人之一(与 Brian Goetz 和其他人一起)。