首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CopyOnWriteArrayList或向量

CopyOnWriteArrayList或向量
EN

Stack Overflow用户
提问于 2010-10-12 18:30:21
回答 2查看 7.4K关注 0票数 10

全,

边缘向量类在ArrayList上的优点是它是同步的,因此确保线程安全。然而,在CopyOnWriteArrayList和Vector之间,应该考虑线程安全和性能方面的优先考虑。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-12 19:14:51

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

您需要在上下文中进行基准测试才能确定,但以下是一些一般原则:

  • 如果只读取数组,那么甚至ArrayList也是线程安全的(因为唯一的非线程安全修改是修改列表的修改)。因此,您可能希望使用非同步的数据结构,无论是ArrayList还是CopyOnWriteArrayList都可能工作得同样好。
  • 如果读取比写更常见,那么您更倾向于使用CopyOnWriteArrayList,因为数组复制开销仅发生在写操作上。如果数组的
  • 是小的,那么制作数组副本的成本也会很小,因此这将有利于CopyOnWriteArrayList而不是Vector.

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

  • 使用ArrayList,但将同步放在的其他地方,以确保线程安全。这实际上是我个人最常使用的方法-基本上,它的想法是使用一个单独的、更高级别的锁来同时保护所有相关的数据结构。这比在每个操作上进行同步要有效得多,因为向量does.
  • Consider是一个不可变的 --由于不可变,这些操作保证线程安全,不需要同步,也可以从低开销中获益(也就是说,它们在不同实例之间共享大部分数据,而不是创建完整的新副本)。像Clojure这样的语言使用这些来获得类似ArrayList的性能,同时也保证了完整的线程安全.
票数 11
EN

Stack Overflow用户

发布于 2010-10-12 18:45:13

这取决于使用模式--如果您的读取量比写入量大得多,请使用CopyOnWriteArrayList,否则使用Vector

Vector为每个操作引入了一个小的同步延迟,当CopyOnWriteArrayList有较长的写入延迟(由于复制),而对于读取则没有延迟。

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

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3917810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档