Java中常用集合&线程安全的集合
程序员文章站
2022-07-12 20:57:51
...
Java中常用集合
(图中忽略中间接口)
Collection接口族下的对象都是存的单一值的元素,而Map接口族下存的是key-value结构的数据。其中Set集合需借助Map对象来实现。
线程安全的List
ArrayList和LinkedList都不是线程安全的,在多线程环境下存在线程安全问题。
1.Vector
Vector通过在方法上加上synchronized关键字修饰来实现线程安全,但Vector的线程安全仅限于单个操作,多个操作并不能保证线程安全。
2.Collections.synchronizedList()
通过List list = Collections.synchronizedList(new ArrayList());
拿到线程安全的List,其内部是通过装饰者模式使用synchronized代码块加锁。
3. CopyOnWriteArrayList
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();
}
}
上一篇: 完美通行证身份证号格式_如何渲染3D足球通行证网络
下一篇: 优雅编程(四)——热部署