Vector vs SynchronizedList性能

时间:2016-01-01 14:29:47

标签: java list collections synchronization

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

  

如果您需要同步,Vector会比与ArrayList同步的Collections.synchronizedList稍快一些

来源:List Implementations

但是当搜索它们之间的差异时,许多人不鼓励使用Vector,并且在需要同步时应该由SynchronizedList替换。 那么哪一方有权被跟踪?

2 个答案:

答案 0 :(得分:0)

Vector当然是一个旧的API。没问题。

对于速度而言,可能只是因为同步列表涉及额外的方法调用以到达并返回数据,因为它毕竟是列表顶部的“包装器”。这就是它的全部,imho。

答案 1 :(得分:0)

当您使用Collections.synchronizedList(new ArrayList<>())时,您将两个实现细节分开。很明显,您如何将基础存储模型从“基于阵列”更改为,例如, “链接节点”,只需将new ArrayList替换为new LinkedList,而不更改synchronized装饰。

Vector“稍微快一点的声明”似乎是基于它的使用不包含包装器和底层存储之间的委托这一事实,但从中得出关于性能的声明甚至是当ArrayListsynchronizedList包装器被引入时,时间可疑。

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

如果您考虑一下,您会发现现实应用程序的大多数操作都包含多个访问权限,因此需要仔细手动锁定,并且每个低级访问方法同步另外可以不仅要带走性能,还要伪装一种不存在的安全性。