【发布时间】:2013-09-24 05:54:47
【问题描述】:
从CopyOnWriteArrayList.java,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();
}
}
add 操作应该加锁不难理解,让我困惑的是它将旧数据复制到新数组并放弃前一个。 同时get方法如下:
public E get(int index) {
return (E)(getArray()[index]);
}
get 方法没有锁定。 我找到了一些解释,有人说复制到一个新数组可以避免 add 和 get 方法在同一个数组上操作。 我的问题是为什么两个线程不能同时读写?
【问题讨论】:
标签: java multithreading collections copy-on-write copyonwritearraylist