java - Vector 与 SynchronizedList 性能

标签 java list collections synchronization

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

If you need synchronization, a Vector will be slightly faster than an ArrayList synchronized with Collections.synchronizedList

来源:List Implementations

但是在寻找它们之间的区别时,很多人不鼓励使用Vector,当需要同步时应该用SynchronizedList代替。 那么哪一方有权利被跟随呢?

最佳答案

当您使用 Collections.synchronizedList(new ArrayList<>()) 时您正在分离两个实现细节。很明显,如何将底层存储模型从“基于数组”更改为,例如“链接节点”,只需替换 new ArrayListnew LinkedList不改变 synchronized装饰。

声明Vector “会稍微快一点”似乎是基于这样一个事实,即它的使用不承担包装器和底层存储之间的委托(delegate),但是从中得出关于性能的陈述在当时甚至是值得怀疑的,当时 ArrayListsynchronizedList包装器被引入。

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

如果你仔细想想,你会意识到现实生活中的应用程序的大多数操作都包含多次访问,因此需要小心的手动锁定,而且每个低级访问方法都同步的事实另外可以不仅会降低性能,它还是假装不存在的安全性的伪装。

关于java - Vector 与 SynchronizedList 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34556989/

相关文章:

java - groovy 调用 Java 父类(super class)中的私有(private)方法

java - 对一个类使用 Get 方法但不对另一个类使用 Get 方法时出现 NullPointEException

java - Jersey - 将 UriInfo 作为类实例变量注入(inject)和将其作为方法参数注入(inject)有什么区别?

python - 在 Python 中拒绝列表的快速方法

c - 奇怪的数字出现在输出-C

java - 无法从 Apache Ant 中的 ${env} 获取属性值

Python __init__ 参数问题

collections - 在 Magento 中按两个类别过滤产品集合

java - 如何按日期对对象列表进行分组?

java - 我们应该使用什么方法来代替 Hazelcast.getMap ("Map")?