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

问题描述:

如果多个线程访问vector,vector将确保只有一个线程可以同时访问vector。 SynchronizedList是相同的。 那有什么区别? 如何在某些同步情况下选择?在java中,Vector和Collections.synchronizedList都是同步的,有什么区别?

+0

考虑使用['CopyOnWriteArrayList'](http://docs.oracle.com创建一个同步代理改为使用/javase/7/docs/api/java/util/concurrent/CopyOnWriteArrayList.html)。 – 2013-02-18 08:32:53

+0

它通常太昂贵。 – 2013-02-18 08:36:51

+0

这个问题已被标记为重复 - 但它应该重复的问题没有得到回答(更确切地说,它有一个“答案”,但它实际上并没有回答这个问题)。 – 2016-07-19 09:14:36

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

如果我在Java 1.2之前正确记得集合是一个独立的库,并且不是标准JDK/JRE的一部分。

此时,像SDK提供的数据结构这样的唯一列表就是Vector。在Collections中,开发人员通过多种方式改进了Vector结构。特别是,他们删除了同步,因为在大多数情况下证明是不必要的。

他们还想让一个简单的方法来创建一个像收集一样的列表的同步版本。因此他们引入了SynchronizedList。

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

在Vector的情况下,您实际上将数据复制到像结构Vector这样的新列表中。所以如果你之前有一个列表,效率会比较低,但是如果你以前没有任何数据结构,那么你可能想使用Vector,因为它不会为每个方法调用添加方法包装成本。向量的另一个缺点是你不能保留其他的底层结构(比如LinkedList),你总是使用Vector中已经实现的东西。

+0

阅读Vector的javadoc,我没有看到它添加到矢量的对象被复制到像结构这样的新列表的任何地方,你可以展开还是在最后一段中仔细检查你的点? – AfterWorkGuinness 2014-05-17 22:11:08

+0

这不完全是我说的。列表的元素不会被复制。我的观点是,如果您要从现有的未同步列表中创建同步向量或列表,则必须将数据从一个复制到另一个(如list2.addAll(list1))。如果你这样做,底层的数据结构就会被复制(不是这些元素)。我建议你打开Vector.java,AbstractList.java和其他相关的类,以查看数据如何从一个集合添加到另一个集合。那对你来说会更清晰。 – ATrubka 2014-06-02 09:14:31

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

使用Java向量是非常不鼓励的,而是建议使用Syncronized“ArrayList”。同样有明显的好处。

请同时参阅Are Vectors Obsolete ?

Vector是同步的列表执行和Collections.synchronziedList是类别实用程序类的方法是,对于任何List实现