【发布时间】:2015-04-30 14:32:37
【问题描述】:
在CopyOnWriteArrayList.java中,在方法@987654322@中
下面:
public E set(int index, E element) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
Object oldValue = elements[index];
if (oldValue != element) {
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len);
newElements[index] = element;
setArray(newElements);
} else {
// Not quite a no-op; ensures volatile write semantics
setArray(elements);----? Why this call required?
}
return (E)oldValue;
} finally {
lock.unlock();
}
}
为什么需要调用setArray?我无法理解该方法调用上面写的评论。是不是因为我们没有使用同步块,我们必须手动刷新我们使用的所有变量?在上述方法中,他们使用可重入锁。如果他们使用了同步语句,他们还需要调用setArray 方法吗?我认为没有。
问题2:如果最后是else,说明我们没有修改elements数组,那为什么要flush变量数组的值呢?
【问题讨论】:
标签: java collections locks java-memory-model