【问题标题】:Why vector in Java has to be synchronized?为什么Java中的向量必须同步?
【发布时间】:2012-07-01 14:08:12
【问题描述】:

我试图理解为什么 Java 中的向量必须同步。无论我通过谷歌到达哪里,他们都说它是同步的,因为它的元素是同步的,当一个线程正在访问它时,它会阻止其他线程访问。但我真正想知道的是为什么会这样?Java 应该把它留给访问它的人。但是为什么 Java 强制所有访问 vector 的人使用同步数据结构呢?我同意有人说 ArrayList 可以用于我的要求。但我的意思是 vector 会给我什么??

感谢和问候, Rengasami Ramanujam

【问题讨论】:

  • Vector 可以追溯到 JDK 1.0(1996 年),当时大规模并发还不是什么大问题。

标签: java vector


【解决方案1】:

历史。

Vector 是 JDK 1.0 的一部分; ArrayList 不是。我们了解到,默认同步意味着性能不佳,因此当 Java Collections API 出现时它被逆转了。

您仍然可以选择使用java.util.Collections 中的方法同步您需要的任何集合,但这是您的选择。

您还应该了解属于java.util.concurrent 包的集合。同时访问集合当然需要精心设计。

【讨论】:

  • 好的,所以 ArrayList 或者更确切地说是 collections 包是解决 Vector rt 发现的性能规模问题的解决方案?
  • 远远不止这些。
  • Vector 提供的那种同步几乎从来都不是你想要的无论如何。 基本上,现代代码不应该使用Vector
【解决方案2】:

但我的意思是那个向量会给我什么??

这是一个“遗留”类。

除非您特别需要同步列表类,否则Vector 在您编写新代码时不会为您提供任何帮助。

但是,Vector (仍然)在那里是有充分理由的。原因是允许您运行为使用 Java 1.0 和 Java 1.1 而编写的旧 Java 代码,或者在一些不包含 Java 集合框架的 Java ME 配置文件上运行。而且它必须(仍然)同步,因为如果他们改变了它,任何使用Vector 的多线程遗留代码都可能中断。

【讨论】:

    【解决方案3】:

    考虑这个示例,它表明您仍需要在应用程序代码中使用同步。

    // BROKEN CODE, needs external synchronization
     // only add an element if the vector is empty
     if(vector.isEmpty())
         vector.add(anElement);
    

    为什么是向量?取决于你在做什么

    在内部,ArrayList 和 Vector 都使用 Array 保存它们的内容。在您的程序中使用任何一个时,您都需要牢记这一事实。将元素插入 ArrayList 或 Vector 时,如果对象空间不足,则需要扩展其内部数组。 Vector 默认将其数组大小增加一倍,而 ArrayList 将其数组大小增加 50%。根据您使用这些类的方式,您最终可能会在添加新元素时受到很大的性能影响。最好将对象的初始容量设置为程序所需的最大容量。通过仔细设置容量,您可以避免支付稍后调整内部数组大小所需的代价。如果你不知道你将拥有多少数据,但你知道它的增长速度,Vector 确实具有一点优势,因为你可以设置增量值。

    【讨论】:

      【解决方案4】:

      您不必强制使用Vector,您也可以使用ArrayLists。

      如果您使用线程,如果它同步,您会很高兴。如果您的应用程序不使用线程,我会使用比Vector 更快的东西。

      【讨论】:

      • 我知道我可以使用 ArrayList。我的问题是,这个向量给我的远不止这些。
      • 答案是。如果您在编写多线程应用程序时需要或多或少的线程安全。
      【解决方案5】:

      使 Vector 同步正是编写该 Java 库的人决定实现它的方式。 ArrayList 和 Vector 都在内部作为数组实现,两者都是动态调整大小的,但 Vector 的 capacityIncrement 是当前数组大小的两倍,而 ArrayList 是当前大小的一半。 Vector 较慢,因为您必须检查是否有其他线程在另一个线程之前访问它。

      如果你需要一个同步的List数据结构,最好使用Collections API.中的synchronizedList(List list)

      【讨论】:

        【解决方案6】:

        如果要同步整个操作序列,请使用 arrayList。 像向量一样同步单个运算符不太安全。

        如果不需要线程安全操作,推荐使用ArrayLists。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-14
          • 2011-01-09
          • 2020-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-21
          相关资源
          最近更新 更多