问题标签 [copyonwritearraylist]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
479 浏览

java - CopyOnWriteArrayList/ConcurrentHashMap 内部如何处理并发修改异常?

我想在内部了解如何在 和 等并发集合中处理并发修改ConcurrentHashMap异常CopyOnWriteArrayList

互联网上有很多博客建议使用这两种数据结构来避免并发修改异常。但没有任何解释,并发收集如何在内部处理此异常。

有人可以对此提供更多见解吗?我需要一些详细的解释。

0 投票
1 回答
236 浏览

multithreading - CopyOnWriteArrayList 未按预期工作

我正在学习 CopyOnWriteArrayList ,但根据我的理解它不能正常工作。我有两个线程,一个是主线程,另一个是内线程。主线程正在从 CopyOnWriteArrayList 集合中删除对象,而内部线程正在休眠 5 秒。主线程在内部线程迭代之前完成了删除操作,但内部线程仍在迭代整个集合,我的意思是由主线程删除。

我期望内部线程不应该迭代由主线程删除的对象。如果我的理解有误,请纠正我。

0 投票
1 回答
85 浏览

java - 了解 CopyOnWriteArrayList 迭代器行为

我正在学习CopyOnWriteArrayList,下面的情况让我思考。

我的主要方法是这样的:

在我读到的javadoc中:

内存一致性影响:与其他并发集合一样,线程中的操作在将对象放入 CopyOnWriteArrayList 之前发生在另一个线程中从 CopyOnWriteArrayList 访问或删除该元素之后的操作。

我期待一个无限循环,因为“在将对象放入 CopyOnWriteArrayList 之前的线程中的操作发生在访问或删除之后的操作之前”

但我的控制台输出是:

我相信,我在这里缺乏一些了解。有人可以帮忙吗?

0 投票
2 回答
1184 浏览

java - 为什么 CopyOnWriteArrayList 的迭代器在增强型 for 循环中允许 remove(),而它的迭代器不支持 remove() 操作?

CopyOnWriteArrayList

迭代器不支持 remove 方法。

但是为什么它在增强的for循环中起作用?

List<String> lst = new ArrayList<>();会产生ConcurrentModificationException

Javadoc 明确指出CopyOnWriteArrayList.iterator()不支持remove()=> 它将抛出UnsupportedOperationException!我知道它是弱一致的 -如果我在从CopyOnWriteArrayList获得迭代器后将ConcurrentModificationException元素添加到CopyOnWriteArrayList

PS对不起,我不专心-我不在迭代器上调用了remove()!我对在增强型内部感到困惑(它隐式使用迭代器)。

0 投票
1 回答
194 浏览

java - java中treeset/CopyOnWriteArrayList的默认大小?

  • TreeSet和的默认大小是CopyOnWriteArrayList多少?
  • TreeSet和的负载系数是CopyOnWriteArrayList多少?
  • TreeSet和的大小增长率是CopyOnWriteArrayList多少?

提前致谢。

0 投票
1 回答
58 浏览

java - CopyOnWriteArrayList 仅适用于迭代而不适用于随机访问读取

我在这个问题线程上遇到了以下评论:

因为 CopyOnWriteArrayList 用于安全遍历。使用它的成本是为每次修改复制底层引用数组,并可能为迭代结构的陈旧版本的线程保留多个副本。ReadWriteLock 将允许多个读取器,并且仍然允许偶尔的写入器执行必要的修改

我刚刚开始学习 CopyOnWriteArrayList,有人可以详细说明上述语句的含义吗?随机访问读取而不是迭代如何使 ReadWriteLock 成为更好的选择?

0 投票
1 回答
44 浏览

java - 如果底层数据结构是 CopyOnWriteArrayList,则 List 上的修改操作线程是否安全?

我想让我的修改操作线程安全,同时也遵守有关应用程序设计的最佳实践。

我假设有一个Zoo类管理其中的动物,比如向Animal动物园添加新动物、删除动物等等,我希望这些操作是线程安全的。为简单起见,我private List<Animal> animals在动物园里有一个变量。我的第一个想法是将animals变量初始化为CopyOnWriteArrayList构造函数中的对象,每当创建新的 Zoo 对象时,如下所示:

据我了解, 的方法CopyOnWriteArrayList是线程安全的,但是我可以通过这种方式实现线程安全,即:通过让底层数据结构为 a CopyOnWriteArrayList,同时将参考变量保持为 aList吗?或者使List<Animal> animals变量 volatile 和有问题的方法synchronized 会是更好的选择吗?

0 投票
1 回答
76 浏览

java - CopyOnWriteArrayList#addIfAbsent的来源问题,为什么需要再次获取数组

我正在学习java并发包。
看完 CopyOnWriteArrayLis 的源码后,我有以下问题。

我的问题是为什么需要优化?
当然,我自己用谷歌搜索过,答案总是在其他线程可能添加了新元素时做出正确的选择

但是如何解释lock.lock()?当一个线程获得锁时,其他线程如何添加新元素?

我知道这可能是一个愚蠢的问题,但我真的对此感到困惑。

0 投票
1 回答
155 浏览

java - CopyOnWriteArrayList 删除时的并发访问问题

我正在努力寻找如何在不出现线程异常的情况下删除CopyOnWriteAccess的元素。

我有以下下载器

main里面:

你知道如何摆脱 ThreadException 吗?谢谢

0 投票
1 回答
60 浏览

java - 为什么 CopyOnWriteArrayList 中只能写一个?

CopyOnWriteArrayList 做得很好。我可以同时从多个线程读取,但我可以从 1 个线程更新。它的工作方式是写入使用数组的单独副本,更新信息并将其设置回原始数组。

问题是:既然写操作使用单独的副本,他们怎么不能并行呢?由于它们现在在不同的阵列中工作,因此不会有任何干扰。因此,无论谁写第一个,它都会将这些新更新设置为原始数组。那么为什么 Java 只允许一次写入呢?

我在这里遗漏了什么,为什么只能写 1 个线程?