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