线程平安的 List
Java 中最罕用的列表为:ArrayList
和 LinkedList
,但这两个线程并非是线程平安的,在多线程状况就须要思考线程平安的 List
Vector
Vector
是在 JDK 1.0 中退出的,历史悠久;
底层原理和 ArrayList
简直统一,区别在于 Vector
每个公开的办法上都退出了 synchronized
保障并发平安,但性能十分底下,不举荐应用
Collections.synchronizedList()
Collections 汇合工具类提供了一个办法能够将 List
转为线程平安的 SynchronizedList
public static <T> List<T> synchronizedList(List<T> list)
原理仅是在每个办法上加上了 synchronized
来保障线程平安,相比于 Vector
扩展性,灵活性更高
public E get(int index) {synchronized (mutex) {return list.get(index);}
}
public E set(int index, E element) {synchronized (mutex) {return list.set(index, element);}
}
public void add(int index, E element) {synchronized (mutex) {list.add(index, element);}
}
public E remove(int index) {synchronized (mutex) {return list.remove(index);}
}
CopyOnWriteArrayList & CopyOnWriteArraySet
利用写时复制(COW)实现线程平安的汇合,
长处是有现成进行批改的时候,仍有其余线程能够读取
毛病是节约空间,每次增加删除元素就须要复制一份新数组
public boolean add(E e) {synchronized (lock) {
// 获取底层存储元素的数组
Object[] es = getArray();
// 拷贝一份到 es 数组中
int len = es.length;
es = Arrays.copyOf(es, len + 1);
// 把元素增加到开端
es[len] = e;
// 把批改复制回去
setArray(es);
return true;
}
}