在阅读有关集合实现的Oracle教程时,我发现以下句子:
来源:List Implementations
但是在寻找它们之间的差异时,许多人不鼓励使用Vector
,并且在需要同步时应将其替换为SynchronizedList
。
那么哪一方应该遵循?
最佳答案
使用Collections.synchronizedList(new ArrayList<>())
时,您将分离两个实现细节。很明显,如何将基础存储模型从“基于阵列”更改为例如通过简单地将new ArrayList
替换为new LinkedList
而不更改synchronized
装饰,即可实现“链接节点”。
声明Vector
“将稍微快一点”似乎是基于这样一个事实,即它的使用并没有在包装程序和底层存储之间进行委派,但是在ArrayList
的时候,甚至由此产生的关于性能的声明都值得商question。并介绍了synchronizedList
包装器。
应该注意的是,当您真正关心多个线程访问的列表的性能时,将不会使用这两种选择。从一开始就存在通过使所有访问方法均为synchronized
来确保存储线程安全的想法。涉及对列表进行多次访问的每个操作,例如诸如if(!list.contains(o)) list.add(o);
或遍历列表甚至是简单的Collections.swap(list, i, j);
之类的简单结构都需要额外的手动同步,才能在多线程设置中正常工作。
如果您仔细考虑一下,您将意识到现实生活中的应用程序的大多数操作都是由多路访问组成的,因此需要仔细的手动锁定,而且每种低级访问方法都需要同步,这一事实不仅会降低性能,而且是一种伪装。假装不存在的安全性。