在java中,Vector和Collections.synchronizedList都是同步的,有什么区别? [重复]

问题描述 投票:0回答:3

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

java list vector synchronization
3个回答
13
投票

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

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

那时SDK提供的唯一列表类数据结构是Vector。在 Collections 中,开发人员以多种方式改进了 Vector 结构。特别是,像 ArrayList 这样的新实现没有同步,因为在大多数情况下它被证明是不必要的。

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

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

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


1
投票

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

强烈建议不要使用 Java Vector,而是建议同步“ArrayList”。显然有相同的好处。

另请参考向量过时了吗?


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.