Vector vs Collections.synchronizedList(ArrayList)

2022-09-01 02:45:19

Vector 是同步的,ArrayList 不是同步的,但是我们可以通过以下方式同步 ArrayList,那么哪个会更好、更快?Collections.synchronizedList(aList)


答案 1

同步收集是浪费时间和危险的。为什么它们是坏的一个微不足道的例子是考虑两个线程同时在同一集合上运行一个循环:

int i = 0;
while (i < list.size())
{
  if (testSomeCondition(list.get())) {
    list.remove(i);
  else
    i++;
}

我们的列表可以同步(例如Vector),这个代码仍然会严重中断。为什么?因为对 size()、get()、remove() 的单个调用是同步的,但一个线程可能仍在从列表中删除项目,而另一个线程正在迭代它。换句话说,我们有一个竞争条件,使用同步集合对我们没有任何好处。

要修复竞争,我们必须同步集合上的整个操作,或者使用 Java 5 并发锁来执行相同的操作。

synchronized (list) {
  int i = 0;
  while (i < list.size())
  {
    if (testSomeCondition(list.get())) {
      list.remove(i);
    else
      i++;
  }
}

此代码块现在是线程安全的,因为一次只有一个线程可以执行循环。现在没有理由使用同步集合。我们可以使用ArrayList而不是Vector,并节省所有这些同步调用的性能损失。

因此,不要使用同步集合。如果您发现自己有多个线程命中同一列表,那么您需要保护列表中的操作,而不是单个调用。


答案 2