CopyOnWriteArrayList
CopyOnWriteArrayList是ArrayList的线程安全版本,当调用add,set等方法时会创建底层数组的一个拷贝
属性
/** The lock protecting all mutators */
final transient ReentrantLock lock = new ReentrantLock();
/** The array, accessed only via getArray/setArray. */
private transient volatile Object[] array;
add
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;
// 将新的副本设置为当前类的副本
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
get
从下面的代码可以看出,get方法并不会竞争锁
public E get(int index) {
return get(getArray(), index);
}
问题
CopyOnWriteArrayList虽然可以是线程安全的,但是因为get方法获取的是当前对象的array属性,当put方法已经创建了一个新的数组拷贝时,get方法是读取不到新数组的
832

被折叠的 条评论
为什么被折叠?



