总结
- 读写分离
- 读写同时进行的时候,读到的是旧数据
- 写(添加、删除)的时候先把原来的容器数据拷贝一份,往拷贝出来的容器中写数据,然后再把原来的引用指向新的容器数据
代码
读
public E get(int index) {
return (E) elements[index];
}
写(同步)
添加:
public synchronized boolean add(E e) {
Object[] newElements = new Object[elements.length + 1];
System.arraycopy(elements, 0, newElements, 0, elements.length);
newElements[elements.length] = e;
elements = newElements;
return true;
}
删除:
public synchronized E remove(int index) {
@SuppressWarnings("unchecked")
E removed = (E) elements[index];
removeRange(index, index + 1);
return removed;
}
private void removeRange(int from, int to) {
Object[] newElements = new Object[elements.length - (to - from)];
System.arraycopy(elements, 0, newElements, 0, from);
System.arraycopy(elements, to, newElements, from, elements.length - to);
elements = newElements;
}