在阅读有关集合实现的 Oracle 教程时,我发现了以下句子:
If you need synchronization, a
Vector
will be slightly faster than anArrayList
synchronized withCollections.synchronizedList
但是在寻找它们之间的区别时,很多人不鼓励使用Vector
,当需要同步时应该用SynchronizedList
代替。
那么哪一方有权利被跟随呢?
最佳答案
当您使用 Collections.synchronizedList(new ArrayList<>())
时您正在分离两个实现细节。很明显,如何将底层存储模型从“基于数组”更改为,例如“链接节点”,只需替换 new ArrayList
与 new LinkedList
不改变 synchronized
装饰。
声明Vector
“会稍微快一点”似乎是基于这样一个事实,即它的使用不承担包装器和底层存储之间的委托(delegate),但是从中得出关于性能的陈述在当时甚至是值得怀疑的,当时 ArrayList
和 synchronizedList
包装器被引入。
应该注意的是,当您真正关心由多个线程访问的列表的性能时,您将两者都不是这两种选择。通过使所有访问方法成为安全存储线程的想法 synchronized
从一开始就有缺陷。每个涉及对列表的多次访问的操作,例如简单的构造,如 if(!list.contains(o)) list.add(o);
或遍历列表,甚至是简单的 Collections.swap(list, i, j);
需要额外的手动同步才能在多线程设置中正常工作。
如果你仔细想想,你会意识到现实生活中的应用程序的大多数操作都包含多次访问,因此需要小心的手动锁定,而且每个低级访问方法都同步的事实另外可以不仅会降低性能,它还是假装不存在的安全性的伪装。
关于java - Vector 与 SynchronizedList 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34556989/