Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向量与同步列表性能_Java_List_Collections_Synchronization - Fatal编程技术网

Java 向量与同步列表性能

Java 向量与同步列表性能,java,list,collections,synchronization,Java,List,Collections,Synchronization,在阅读有关集合实现的Oracle教程时,我发现了以下句子: 如果需要同步,向量将比与集合同步的数组列表略快。同步列表 资料来源: 但是,当寻找它们之间的差异时,许多人不鼓励使用向量,当需要同步时,应该用同步列表代替。 那么哪一方有权遵循呢?向量当然是一个旧的API。没有问题 但为了提高速度,这可能只是因为同步列表涉及额外的方法调用来访问和返回数据,因为它毕竟是列表顶部的“包装器”。这就是它的全部内容,imho。当您使用Collections.synchronizedList(new ArrayL

在阅读有关集合实现的Oracle教程时,我发现了以下句子:

如果需要同步,
向量
将比与
集合同步的
数组列表
略快。同步列表

资料来源:

但是,当寻找它们之间的差异时,许多人不鼓励使用
向量
,当需要同步时,应该用
同步列表
代替。
那么哪一方有权遵循呢?

向量当然是一个旧的API。没有问题


但为了提高速度,这可能只是因为同步列表涉及额外的方法调用来访问和返回数据,因为它毕竟是列表顶部的“包装器”。这就是它的全部内容,imho。

当您使用
Collections.synchronizedList(new ArrayList())
时,您正在分离两个实现细节。很明显,您可以通过简单地将
new ArrayList
替换为
new LinkedList
而不更改
synchronized
装饰,将底层存储模型从“基于阵列”更改为“链接节点”

“Vector将稍微快一点”的说法似乎是基于这样一个事实,即它的使用不会在包装器和底层存储之间产生委托关系,但从中得出关于性能的陈述在当时甚至是有问题的,当引入
ArrayList
synchronizedList
包装器时

应该注意的是,当您真正关心由多个线程访问的列表的性能时,您将不使用这两种选择。通过同步所有访问方法
使存储线程安全的想法从一开始就是有缺陷的。涉及对列表的多个访问的每个操作,例如,
if(!list.contains(o))list.add(o)等简单构造
或在列表上迭代,甚至是一个简单的
Collections.swap(list,i,j)需要额外的手动同步才能在多线程设置中正常工作


仔细想想,您会发现现实生活中应用程序的大多数操作都是由多个访问组成的,因此需要小心的手动锁定,而且每个低级访问方法都会进行额外的同步,这不仅会降低性能,而且是一种伪装,假装没有安全性

性能差异(如果有的话)以及自撰写本文以来是否仍然存在,可能可以忽略不计。向量应被视为已弃用。就好像它不存在一样。此外,Collections.synchronizedList()清楚地表达了意图:它向读者说:我需要一个同步列表。然而new Vector对读者说:这一定是几年前写的,或者是一个17年前学会Java但从未跟上最新潮流的程序员写的。@jbnize有没有任何例子表明Vector不适合同步,SynchronizedList做得比它更好,因为当我查看他们的代码时,他们都使用了同步的bloc/方法,不是一个是同步的,另一个不是。我没那么说。Vector比Collections API更早,带来了大量过时的方法,并被ArrayList和Collections.synchronizedList(ArrayList)取代。如果它还没有被正式弃用,可能是因为它仍然在JDK的其他旧类的公共API中使用。但是你应该考虑它。“JBNIZET感谢你的解释,教程应该是更新的。@ NurutoBiJuMooT注:矢量被java 1.2替换(1998)它真的太旧了,除非你必须使用它,否则你不应该使用它。