为什么在CopyOnWriteArrayList中设置(int index,E element)函数是如此繁琐?

时间:2016-03-15 15:50:01

标签: java data-structures collections

源代码在这里:

public E set(int index, E element) {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        Object[] elements = getArray();
        E oldValue = get(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);
        }
        return oldValue;
    } finally {
        lock.unlock();
    }
}

但我认为if-else块可能更简洁如下:

if (oldValue != element) {
    elements[index] = element;
}

请提前帮助我。

2 个答案:

答案 0 :(得分:2)

正如类名所示,此类执行基础数据结构(即数组)的写时复制。

每当修改数组时,都需要复制一份。如果修改现有数组,其他功能(如迭代)可能无法按预期运行。

答案 1 :(得分:1)

CopyOnWriteArrayList在任何mutator方法中创建新的数组实例,以确保Iterator始终使用" snapshot"底层数组数据的实际情况是迭代器创建的时刻。 它会阻止ConcurrentModificationException,但某些值可能会过时(例如,已删除的元素)