【问题标题】:Vector vs SynchronizedList performanceVector vs SynchronizedList 性能
【发布时间】:2023-03-08 00:31:01
【问题描述】:

在阅读有关集合实现的 Oracle 教程时,我发现了以下句子:

如果您需要同步,Vector 将比与 Collections.synchronizedList 同步的 ArrayList 稍快

来源:List Implementations

但是在寻找它们之间的区别时,很多人不鼓励使用Vector,当需要同步时应该用SynchronizedList代替。 那么哪一方有权被追随?

【问题讨论】:

  • 性能差异(如果有的话)以及自撰写文章以来是否仍然存在,可能可以忽略不计。 Vector 应被视为已弃用。就当它不存在一样。此外,Collections.synchronizedList() 清楚地表达了意图:它对读者说:我需要一个同步列表。而 new Vector 对读者说:这一定是几年前写的,或者是由 17 年前学习 Java 并且从未更新过的程序员编写的。
  • @JBNizet 是否有任何示例表明 Vector 不适合同步,而 SynchronizedList 做得比它更好,因为当我查看他们的代码时,它们都使用同步块/方法。
  • 不是一个同步一个不同步。我没这么说。就是 Vector 早于 Collections API,带来了很多过时的方法,并被 ArrayList 和 Collections.synchronizedList(arrayList) 取代。如果它还没有被官方弃用,那可能是因为它仍在 JDK 的其他旧类的公共 API 中使用。但你应该这样考虑。
  • @JBNizet 感谢您的澄清,教程是应该更新的。
  • @NarutoBijuMode 注意:Vector 在 Java 1.2 (1998) 中被替换了它真的太老了,除非你必须,否则你不应该使用它。

标签: java list collections synchronization


【解决方案1】:

当您使用Collections.synchronizedList(new ArrayList<>()) 时,您将两个实现细节分开。很清楚,如何将底层存储模型从“基于数组”更改为,例如“链接节点”,只需将 new ArrayList 替换为 new LinkedList,而不更改 synchronized 装饰。

Vector“会稍微快一点”的声明似乎是基于这样一个事实,即它的使用不承担包装器和底层存储之间的委托,但由此得出的关于性能的声明甚至受到质疑引入 ArrayListsynchronizedList 包装器的时间。

需要注意的是,当您真正关心多线程访问的列表的性能时,您不会使用这两种选择中的一个。通过使所有访问方法synchronized 来使存储线程安全的想法从一开始就存在缺陷。每个涉及对列表的多次访问的操作,例如像if(!list.contains(o)) list.add(o); 这样的简单构造或遍历列表甚至是简单的Collections.swap(list, i, j); 都需要额外的手动同步才能在多线程设置中正常工作。

如果您仔细考虑一下,您会发现现实生活中的应用程序的大多数操作都包含多个访问,因此需要仔细的手动锁定,并且每个低级访问方法同步的事实另外可以不仅会带走性能,它也是一种伪装,假装不存在的安全。

【讨论】:

    【解决方案2】:

    当然,Vector 是一个旧 API。没有问题。

    但为了速度,这可能只是因为同步列表涉及额外的方法调用来获取和返回数据,因为它毕竟是列表顶部的“包装器”。就是这样,恕我直言。

    【讨论】:

      猜你喜欢
      • 2021-02-27
      • 1970-01-01
      • 2012-06-30
      • 2014-12-18
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 2016-09-08
      相关资源
      最近更新 更多