CopyOnWriteArrayList

2020-12-12  本文已影响0人  Travis_Wu

一、CopyOnWriteArrayList 出现之前

二、适用场景

三、读写规则

四、特点

五、源码分析

/** 可重入锁对象 */ 
final transient ReentrantLock lock = new ReentrantLock(); 
/** CopyOnWriteArrayList底层由数组实现,volatile修饰,保证数组的可见性 */ 
private transient volatile Object[] array; 
/**
 * 得到数组 
 */ 
final Object[] getArray() { 
    return array; 
}
/**
 * 设置数组 
 */ 
final void setArray(Object[] a) { 
    array = a; 
}
/**
 * 初始化CopyOnWriteArrayList相当于初始化数组 
 */ 
public CopyOnWriteArrayList() { 
    setArray(new Object[0]); 
}
public boolean add(E e) { 
    // 加锁 
    final ReentrantLock lock = this.lock; 
    lock.lock(); 
    try {
        // 得到原数组的长度和元素 
        Object[] elements = getArray(); 
        int len = elements.length; 
        // 复制出一个新数组 
        Object[] newElements = Arrays.copyOf(elements, len + 1); 
        // 添加时,将新元素添加到数组中 
        newElements[len] = e; 
        // 将volatile Object[] array 的指向替换成新数组 
        setArray(newElements); 
        return true; 
    } finally { 
        lock.unlock(); 
    } 
}
public E get(int index) { 
    return get(getArray(), index); 
} 
final Object[] getArray() { 
    return array; 
}
private E get(Object[] a, int index) { 
    return (E) a[index]; 
}
上一篇 下一篇

猜你喜欢

热点阅读