乐趣区

关于java:Java-中线程安全的-List

线程平安的 List

Java 中最罕用的列表为:ArrayListLinkedList,但这两个线程并非是线程平安的,在多线程状况就须要思考线程平安的 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;
    }
}
退出移动版