问题标签 [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.
java - CopyOnWriteArrayList/ConcurrentHashMap 内部如何处理并发修改异常?
我想在内部了解如何在 和 等并发集合中处理并发修改ConcurrentHashMap
异常CopyOnWriteArrayList
。
互联网上有很多博客建议使用这两种数据结构来避免并发修改异常。但没有任何解释,并发收集如何在内部处理此异常。
有人可以对此提供更多见解吗?我需要一些详细的解释。
multithreading - CopyOnWriteArrayList 未按预期工作
我正在学习 CopyOnWriteArrayList ,但根据我的理解它不能正常工作。我有两个线程,一个是主线程,另一个是内线程。主线程正在从 CopyOnWriteArrayList 集合中删除对象,而内部线程正在休眠 5 秒。主线程在内部线程迭代之前完成了删除操作,但内部线程仍在迭代整个集合,我的意思是由主线程删除。
我期望内部线程不应该迭代由主线程删除的对象。如果我的理解有误,请纠正我。
java - 了解 CopyOnWriteArrayList 迭代器行为
我正在学习CopyOnWriteArrayList
,下面的情况让我思考。
我的主要方法是这样的:
在我读到的javadoc中:
内存一致性影响:与其他并发集合一样,线程中的操作在将对象放入 CopyOnWriteArrayList 之前发生在另一个线程中从 CopyOnWriteArrayList 访问或删除该元素之后的操作。
我期待一个无限循环,因为“在将对象放入 CopyOnWriteArrayList 之前的线程中的操作发生在访问或删除之后的操作之前”。
但我的控制台输出是:
我相信,我在这里缺乏一些了解。有人可以帮忙吗?
java - 为什么 CopyOnWriteArrayList 的迭代器在增强型 for 循环中允许 remove(),而它的迭代器不支持 remove() 操作?
迭代器不支持 remove 方法。
但是为什么它在增强的for循环中起作用?
List<String> lst = new ArrayList<>();
会产生ConcurrentModificationException
Javadoc 明确指出CopyOnWriteArrayList.iterator()
不支持remove()
=> 它将抛出UnsupportedOperationException
!我知道它是弱一致的 -如果我在从CopyOnWriteArrayList获得迭代器后将ConcurrentModificationException
元素添加到CopyOnWriteArrayList
PS对不起,我不专心-我不在迭代器上调用了remove()!我对在增强型内部感到困惑(它隐式使用迭代器)。
java - java中treeset/CopyOnWriteArrayList的默认大小?
TreeSet
和的默认大小是CopyOnWriteArrayList
多少?TreeSet
和的负载系数是CopyOnWriteArrayList
多少?TreeSet
和的大小增长率是CopyOnWriteArrayList
多少?
提前致谢。
java - CopyOnWriteArrayList 仅适用于迭代而不适用于随机访问读取
我在这个问题线程上遇到了以下评论:
因为 CopyOnWriteArrayList 用于安全遍历。使用它的成本是为每次修改复制底层引用数组,并可能为迭代结构的陈旧版本的线程保留多个副本。ReadWriteLock 将允许多个读取器,并且仍然允许偶尔的写入器执行必要的修改
我刚刚开始学习 CopyOnWriteArrayList,有人可以详细说明上述语句的含义吗?随机访问读取而不是迭代如何使 ReadWriteLock 成为更好的选择?
java - 如果底层数据结构是 CopyOnWriteArrayList,则 List 上的修改操作线程是否安全?
我想让我的修改操作线程安全,同时也遵守有关应用程序设计的最佳实践。
我假设有一个Zoo
类管理其中的动物,比如向Animal
动物园添加新动物、删除动物等等,我希望这些操作是线程安全的。为简单起见,我private List<Animal> animals
在动物园里有一个变量。我的第一个想法是将animals
变量初始化为CopyOnWriteArrayList
构造函数中的对象,每当创建新的 Zoo 对象时,如下所示:
据我了解, 的方法CopyOnWriteArrayList
是线程安全的,但是我可以通过这种方式实现线程安全,即:通过让底层数据结构为 a CopyOnWriteArrayList
,同时将参考变量保持为 aList
吗?或者使List<Animal> animals
变量 volatile 和有问题的方法synchronize
d 会是更好的选择吗?
java - CopyOnWriteArrayList#addIfAbsent的来源问题,为什么需要再次获取数组
我正在学习java并发包。
看完 CopyOnWriteArrayLis 的源码后,我有以下问题。
我的问题是为什么需要优化?
当然,我自己用谷歌搜索过,答案总是在其他线程可能添加了新元素时做出正确的选择。
但是如何解释lock.lock()?当一个线程获得锁时,其他线程如何添加新元素?
我知道这可能是一个愚蠢的问题,但我真的对此感到困惑。
java - CopyOnWriteArrayList 删除时的并发访问问题
我正在努力寻找如何在不出现线程异常的情况下删除CopyOnWriteAccess的元素。
我有以下下载器类
在main里面:
你知道如何摆脱 ThreadException 吗?谢谢
java - 为什么 CopyOnWriteArrayList 中只能写一个?
CopyOnWriteArrayList 做得很好。我可以同时从多个线程读取,但我可以从 1 个线程更新。它的工作方式是写入使用数组的单独副本,更新信息并将其设置回原始数组。
问题是:既然写操作使用单独的副本,他们怎么不能并行呢?由于它们现在在不同的阵列中工作,因此不会有任何干扰。因此,无论谁写第一个,它都会将这些新更新设置为原始数组。那么为什么 Java 只允许一次写入呢?
我在这里遗漏了什么,为什么只能写 1 个线程?