线程平安的 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)实现线程平安的汇合,
长处来源gaodai#ma#com搞*代#码网是有现成进行批改的时候,仍有其余线程能够读取
毛病是节约空间,每次增加删除元素就须要复制一份新数组
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; } }