【问题标题】:In java, Vector and Collections.synchronizedList are all synchronized, what's the difference? [duplicate]java中Vector和Collections.synchronizedList都是同步的,有什么区别呢? [复制]
【发布时间】:2013-02-18 08:21:12
【问题描述】:

如果多个线程访问vector,vector会保证同时只有一个线程可以访问vector。 SynchronizedList 是相同的。 那么有什么区别呢? 在某些同步情况下如何选择?

【问题讨论】:

  • 考虑改用CopyOnWriteArrayList
  • 通常成本太高。
  • 这个问题已被标记为重复 - 但它应该重复的问题尚未得到回答(更准确地说,它有一个“答案”,但它实际上并没有回答这个问题)。

标签: java list vector synchronization


【解决方案1】:

这种冗余的主要原因是向后兼容为旧版本 Java 开发的 Java 代码。

如果我没记错的话,Java 1.2 之前集合是一个单独的库,不是标准 JDK/JRE 的一部分。

那时,SDK 提供的唯一类似列表的数据结构是 Vector。在 Collections 中,开发人员以多种方式改进了 Vector 结构。特别是,他们删除了同步,因为在大多数情况下它被证明是不必要的。

他们仍然希望提供一种简单的方法来创建类似集合的列表的同步版本。因此他们引入了 SynchronizedList。

现在 Vector 和 SynchronizedList 之间的主要区别在于您使用它的方式。通过调用 Collections.synchronizedList 您可以围绕当前的 List 实现创建一个包装器,这意味着您不会将数据复制到另一个数据结构并保持底层结构完整。例如,如果你想要 LinkedList 结构而不是 ArrayList。

如果是 Vector,您实际上会将数据复制到新列表中,例如结构 Vector。因此,如果您之前有一个列表,那么效率会降低,但是如果您之前没有任何数据结构,那么您可能想要使用 Vector,因为它不会为每个方法调用增加方法包装成本。向量的另一个缺点是您不能保留替代的底层结构(例如 LinkedList),您总是使用向量本身中实现的内容。

【讨论】:

  • 阅读 Vector 的 javadoc,我没有看到任何地方说添加到矢量的对象被复制到一个新的列表,如结构,你可以扩展/或仔细检查你最后的观点段落?
  • 这不是我所说的。不复制列表的元素。我的观点是,如果您要从现有的未同步列表中创建同步向量或列表,则必须将数据从一个复制到另一个(类似于 list2.addAll(list1))。如果这样做,则会复制底层数据结构(但不是元素)。我建议你打开 Vector.java、AbstractList.java 和其他相关类,看看数据是如何从一个集合添加到另一个集合的。到时候你会更清楚。
【解决方案2】:

Java 向量默认是同步的。您不必明确同步。即使这样做也没有额外的好处

强烈建议不要使用 Java Vector,而是建议使用 Syncronized "ArrayList"。显然有同样的好处。

另请参考Are Vectors Obsolete ?

【讨论】:

    【解决方案3】:

    Vector 是一个同步的 List 实现,而 Collections.synchronziedList 是 Collections 实用程序类的一个方法,它为任何 List 实现创建一个同步代理

    【讨论】:

      猜你喜欢
      • 2010-11-12
      • 2012-01-21
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 2012-03-17
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多