vector

Collections.synchronizedList

和上面一样,也是通过synchronized来确保线程安全。

SynchronizedList和Vector最主要的区别

  1. SynchronizedList有很好的扩展和兼容功能。他可以将所有的List的子类转成线程安全的类。
  2. 使用SynchronizedList的时候,进行遍历时要手动进行同步处理。 (vector也不能安全的遍历吧?)
  3. SynchronizedList可以指定锁定的对象

SynchronizedList和Vector的区别 - 陆佳骅的博客 - 博客园

CopyOnWriteArrayList

使用ReentrantLock,同一时刻只能有一个线程来写操作。

  • 原理:首先将当前容器复制一份,然后在新副本上执行写操作,结束之后再将原容器的引用指向新容器。
  • 优点:读性能高,遍历不抛异常
  • 缺点:1. 占内存 2. 无法保证实时性(取决于迭代器生成时间)
  • CopyOnWriteArrayList实现原理及源码分析 - dreamcatcher-cx - 博客园

    安全地遍历List

  • 使用CopyOnWriteArrayList可以线程安全地遍历

  • synchronizedList遍历需要加锁
    1. List list = Collections.synchronizedList(new ArrayList());
    2. ...
    3. synchronized (list) {
    4. Iterator i = list.iterator(); // Must be in synchronized block
    5. while (i.hasNext())
    6. foo(i.next());
    7. }
  1. vector.forEach()可以安全遍历