В CopyOnWriteArrayList.java, в наборе методов (int index, E element) ниже
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()?. Я думаю нет.
Question2: Если мы закончим иначе, это означает, что мы не модифицировали массив элементов, то почему нам нужно сбросить значение массива переменных?