当前位置: 首页 > 面试题库 >

在什么情况下,CopyOnWriteArrayList是合适的?[重复]

谢清野
2023-03-14
问题内容

我正在学习CopyOnWriteArrayList类。

  • 复制新阵列的目的是什么?
  • 是其他线程读取数组吗?

因此,如果系统具有高并发性,并且大多数线程的操作都在读取而不是写入,那么最好使用CopyOnWriteArrayList


问题答案:

如该链接所述:

CopyOnWriteArrayList是Java
5并发API中引入的并发Collection类,以及它ConcurrentHashMap在Java中流行的表亲。

CopyOnWriteArrayList工具列表界面类似ArrayListVector并且LinkedList但它的一个线程安全的集合,它实现了线程安全比Vector或其他线程安全的集合类的方式略有不同。

顾名思义,CopyOnWriteArrayList会在每次更改操作(例如添加或设置)时创建基础ArrayList的副本。通常,CopyOnWriteArrayList非常昂贵,因为它涉及每次写操作的昂贵的Array复制,但是
如果您有一个Iteration数量超过突变的List,则它非常有效, 例如,您最需要迭代ArrayList且不要经常修改它。

CopyOnWriteArrayList的迭代器是故障安全的, 即使迭代开始后修改了基础CopyOnWriteArrayList
,也不会引发ConcurrentModificationException,这
是因为Iterator在ArrayList的单独副本上进行操作。因此,在CopyOnWriteArrayList上进行的所有更新都不适用于Iterator。

要获得最新版本,请重新读一遍类似 list.iterator();

话虽这么说,大量更新此集合会降低性能。如果您尝试对a进行排序CopyOnWriteArrayList,则会看到该列表抛出一个UnsupportedOperationException(对集合调用N次设置的排序调用)。仅当您进行超过90%以上的读取时,才应使用此读取。



 类似资料:
  • 本文向大家介绍在什么情况下选择webpack?在什么情况下选择rollup?相关面试题,主要包含被问及在什么情况下选择webpack?在什么情况下选择rollup?时的应答技巧和注意事项,需要的朋友参考一下 非要一句话区分的话 如果是用,如果是用其实界限并不是特别明显。在某些特殊情况下可以互用

  • 问题内容: 我希望下面的代码在上引发编译时错误,因为未声明为throw ,但编译成功(在Java 1.7.0_45中),并且如果编译时错误为,则会生成您期望的输出固定。 如果更改为,它也会编译。 不会按预期方式编译: 这样编译: 这不是: 这也可以编译: 一个更复杂的示例-被检查的异常由外部catch块捕获,而不是被声明为抛出。这样编译: 因此,当编译器可以确定捕获的异常始终合法地重新抛出时,似乎

  • 问题内容: 我正在编写一个消耗大量内存的缓存应用程序。 希望我会足够好地管理内存,但是我只是在考虑如果内存用完了该怎么办。 如果分配一个简单对象的调用失败,那么即使是syslog调用也可能失败吗? 编辑:好的,也许我应该澄清这个问题。如果malloc或new返回NULL或0L值,则从本质上讲这意味着调用失败,并且由于某种原因它无法为您提供内存。那么,在这种情况下明智的做法是什么? EDIT2:我刚

  • 问题内容: 我需要创建一个使用12个参数的存储过程,并使用此参数的不同组合来过滤查询。所有12个参数都不是强制性的,好像我传递3或5或12个参数取决于用户输入的搜索输入。 我可以使用动态SQL查询或“ Case where”语句创建2种方法。这些查询的示例如下: 动态查询 DECLARE @condition VARCHAR(MAX)=’‘ Declare @var1 varchar(10) De

  • 问题内容: 今天,在浏览各种问题时,我遇到了一个问题,在我看来有点不可思议,为什么一个人要在上面加上a ,对于这种情况会不会有什么真正的原因,所以这只是微不足道的吗? 问题答案: 动画图像作为GUI的BG。我使用HTML来调整此尺寸(x3),但是如果它已经是所需的尺寸,则可以直接将其设置为标签的。 不知道它是否是“真正的”。这似乎是一个主观术语,需要更多说明。我从来没有使用过这种方法,只是想通了,

  • 问题内容: 说我有一个清单。在什么情况下被称为? 我基本上理解了文档,但是我也想看到一个示例来毫无疑问地阐明其用法。 问题答案: 当Python尝试将两个对象相乘时,它首先尝试调用左侧对象的方法。如果左对象没有方法(或者该方法返回,表明它不适用于所讨论的右操作数),则Python希望知道右对象是否可以进行乘法。如果右操作数与左操作数的类型相同,Python就会知道它不能,因为如果左对象不能做到这一