java - Vector vs Collections.synchronizedList(ArrayList)

标签 java collections vector arraylist

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

最佳答案

同步收集既浪费时间又危险。为什么它们不好的一个简单例子是考虑两个线程在同一个集合上同时运行一个循环:

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,这样可以避免所有这些同步调用的性能损失。

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

关于java - Vector vs Collections.synchronizedList(ArrayList),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2883140/

相关文章:

java - 父类(super class)公共(public)方法实现

java - 如何有效地在 Java 中创建复杂的字符串?

java - 为什么 AbstractCollection 不实现 iterator()?

java - 如何删除ArrayList中与原始元素重复的值

c++ - 如何在每次循环迭代期间生成一个 vector ,存储数据,然后删除该 vector ?

java - 给我解释一下十六进制 'x'中的 '0xf0'是从哪里来的

java - 当要模拟的方法有多个参数时,如何使用 Jmock 编写自定义约束

c# - 在 C# 中传递派生对象的集合

c++ - 将字符串拆分为两个不同的 vector C++

java - LibGDX:如何在不修改原始 vector 的情况下将 vector 与标量相乘? (Java游戏中的简单重力系统)