CopyOnWriteArray或Vector

nam*_*ked 8 java collections thread-safety

所有,

边缘Vector类具有over ArrayList,它是同步的,因此确保线程安全.但是,在CopyOnWriteArray和Vector之间,考虑到线程安全性和性能,应该首选什么.

mik*_*era 9

总的来说,它取决于读写操作的频率和性质,以及数组的大小.

您需要在您的上下文中进行基准测试以确定,但这里有一些一般原则:

  • 如果您只是要读取数组,那么甚至ArrayList也是线程安全的(因为唯一的非线程安全修改是那些修改列表的修改).因此,您可能希望使用非同步数据结构,ArrayList或CopyOnWriteArrayList可能同样有效.
  • 如果读取比写入更常见,那么您倾向于更喜欢CopyOnWriteArrayList,因为数组复制开销仅在写入时产生.
  • 如果Array大小很小,那么制作数组副本的成本也会很小,因此这将有利于CopyOnWriteArrayList而不是Vector.

您可能还想考虑另外两个选项:

  • 使用ArrayList但将同步放在其他位置以确保线程安全.这实际上是我个人经常使用的方法 - 基本上我的想法是使用单独的更高级别的锁来同时保护所有相关的数据结构.这比像Vector一样在每个操作上进行同步更有效.
  • 考虑一个不可变的持久数据结构 - 由于不变性,保证它们是线程安全的,不需要同步,也可以从低开销中受益(即它们在不同实例之间共享大多数数据而不是制作完整的新副本).像Clojure这样的语言使用这些语言来获得类似ArrayList的性能,同时还保证了完整的线程安全性.


axt*_*avt 8

这取决于使用模式 - 如果您有更多的读取而不是写入,请使用CopyOnWriteArrayList,否则使用Vector.

Vector每次操作都会引入一个小的同步延迟,当CopyOnWriteArrayList写入延迟较长时(由于复制)但没有读取延迟.

另一个考虑因素是迭代器的行为 - Vector在迭代它时需要显式同步(因此写操作不能同时执行),CopyOnWriteArrayList否则.