在阅读关于集合实现的Oracle教程时,我发现了以下句子:
如果您需要同步,
Vector
会比与ArrayList
同步的Collections.synchronizedList
稍快一些
但是当搜索它们之间的差异时,许多人不鼓励使用Vector
,并且在需要同步时应该由SynchronizedList
替换。
那么哪一方有权被跟踪?
答案 0 :(得分:0)
Vector当然是一个旧的API。没问题。
对于速度而言,可能只是因为同步列表涉及额外的方法调用以到达并返回数据,因为它毕竟是列表顶部的“包装器”。这就是它的全部,imho。
答案 1 :(得分:0)
当您使用Collections.synchronizedList(new ArrayList<>())
时,您将两个实现细节分开。很明显,您如何将基础存储模型从“基于阵列”更改为,例如, “链接节点”,只需将new ArrayList
替换为new LinkedList
,而不更改synchronized
装饰。
Vector
“稍微快一点的声明”似乎是基于它的使用不包含包装器和底层存储之间的委托这一事实,但从中得出关于性能的声明甚至是当ArrayList
和synchronizedList
包装器被引入时,时间可疑。
应该注意的是,当您真正关心多个线程访问的列表的性能时,您将使用这两个备选方案的 。通过使所有访问方法synchronized
从一开始就存在缺陷,使存储线程安全的想法是有缺陷的。涉及对列表的多次访问的每个操作,例如,像if(!list.contains(o)) list.add(o);
这样的简单构造或迭代列表甚至是简单的Collections.swap(list, i, j);
都需要额外的手动同步才能在多线程设置中正常工作。
如果您考虑一下,您会发现现实应用程序的大多数操作都包含多个访问权限,因此需要仔细手动锁定,并且每个低级访问方法同步另外可以不仅要带走性能,还要伪装一种不存在的安全性。