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

roa*_*oul 4 java synchronization list vector

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

ATr*_*bka 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本身实现的东西.