1

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

谢谢和问候, Rengasami Ramanujam

4

6 回答 6

10

历史。

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

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

您还应该了解作为java.util.concurrent包一部分的集合。同时访问集合当然需要精心设计。

于 2012-07-01T14:13:58.973 回答
2

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

这是一个“遗留”类。

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

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

于 2012-07-01T14:21:51.207 回答
1

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

// 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%。根据您使用这些类的方式,您最终可能会在添加新元素时受到很大的性能影响。最好将对象的初始容量设置为程序所需的最大容量。通过仔细设置容量,您可以避免支付稍后调整内部数组大小所需的代价。如果您不知道您将拥有多少数据,但您确实知道它的增长速度,

于 2012-07-01T14:14:07.230 回答
0

您不必被迫使用 aVector您也可以使用ArrayLists。

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

于 2012-07-01T14:12:44.000 回答
0

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

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

于 2012-07-01T14:19:05.307 回答
0

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

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

于 2017-03-01T09:38:20.233 回答