赞
踩
Collection接口族下的对象都是存的单一值的元素,而Map接口族下存的是key-value结构的数据。其中Set集合需借助Map集合来实现。
ArrayList和LinkedList都不是线程安全的,在多线程环境下存在线程安全问题。
Vector通过在方法上加上synchronized关键字修饰来实现线程安全,但Vector的线程安全仅限于单个操作,多个操作并不能保证线程安全。
通过List list = Collections.synchronizedList(new ArrayList());
拿到线程安全的List,其内部是通过装饰者模式使用synchronized代码块加锁。
CopyOnWriteArrayList位于java.util.concurrent并发包下,实现List接口。Vector和Collections.synchronizedList()都对get方法加了锁,而CopyOnWriteArrayList没有对读加锁。因为写操作每次都要新建一个数组,把原数组拷贝过去,在末尾加上新增元素,最后替换原数组,以此来保证读写并发时不需要对读操作加锁也能保证线程安全,但每次都要新建数组,对写性能有影响。
public boolean add(E e) { // CopyOnWriteArrayList采用ReentrantLock加锁 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(); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。