vector
Collections.synchronizedList
和上面一样,也是通过synchronized来确保线程安全。
SynchronizedList和Vector最主要的区别
- SynchronizedList有很好的扩展和兼容功能。他可以将所有的List的子类转成线程安全的类。
- 使用SynchronizedList的时候,进行遍历时要手动进行同步处理。 (vector也不能安全的遍历吧?)
- SynchronizedList可以指定锁定的对象。
SynchronizedList和Vector的区别 - 陆佳骅的博客 - 博客园
CopyOnWriteArrayList
使用ReentrantLock,同一时刻只能有一个线程来写操作。
- 原理:首先将当前容器复制一份,然后在新副本上执行写操作,结束之后再将原容器的引用指向新容器。
- 优点:读性能高,遍历不抛异常
- 缺点:1. 占内存 2. 无法保证实时性(取决于迭代器生成时间)
CopyOnWriteArrayList实现原理及源码分析 - dreamcatcher-cx - 博客园
安全地遍历List
使用CopyOnWriteArrayList可以线程安全地遍历
- synchronizedList遍历需要加锁
List list = Collections.synchronizedList(new ArrayList());
...
synchronized (list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
- vector.forEach()可以安全遍历