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

时间:2013-02-18 08:21:13

标签: java list vector synchronization

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

3 个答案:

答案 0 :(得分:11)

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

如果我在Java 1.2 Collections之前没有正确记住它是一个单独的库而且不是标准JDK / JRE的一部分。

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

他们仍然想要一种简单的方法来创建像集合一样的列表的同步版本。因此他们引入了SynchronizedList。

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

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

答案 1 :(得分:1)

默认情况下,Java Vectors是同步的。您不必显式同步。即使你这样做也没有额外的好处

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

另请参阅Are Vectors Obsolete ?

答案 2 :(得分:0)

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