问题标签 [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 投票
2 回答
85 浏览

java - servlet 中 CopyOnArrayList 的线程安全

我只是从 servlet 和线程开始。最终实例变量是线程安全的,CopyOnArrayList 也是如此。为什么以下代码不是线程安全的(它是最终的 + 我使用了 CopyOnArrayList)?

JSP代码:

首先我得到 3 个 Cat 实例。刷新时我得到 6,然后是 9、12,等等。为什么?当我在 doGet 方法中声明 CopyOnWriteArrayList 或使用简单数组时,不会出现此问题。我不明白它背后的逻辑:最终实例变量和 CopyOnWriteArrayList 应该是线程安全的。谢谢大家澄清这一点。

0 投票
3 回答
219 浏览

list - 如何删除列表中的项目?

我在嵌套循环中有两个列表,当我在内部匹配一个项目时,我想删除它以便提高性能。

我有一个java.util.ConcurrentModificationException错误。如果我改为 CopyOnWriteArrayList,错误如下:

现在我该怎么办?省略删除?还是别的?

我认为这是我需要的:

0 投票
1 回答
229 浏览

java - CopyOnWriteArrayList 上的线程中的迭代器不起作用

我正在为 OCP 考试做一些练习。目前,我尝试在使用多个线程时打印CopyOnWriteArrayList内容。根据文档, CopyOnWriteArrayList 的迭代器将

打印创建迭代器时存在的列表中的数字

因此,当在 CopyOnWriteArrayList 上启动一个线程写入并从 CopyOnWriteArrayList读取另一个线程时,我希望(有时)打印出一些项目。在编写线程完成后遍历 CopyOnWriteArrayList 时,我希望有一个新的迭代器打印出所有项目

不幸的是,这在使用Runnable 接口的匿名实现时不起作用。但它在使用自定义线程类时有效,我在其中传递了对 CopyOnWriteArrayList 的引用。

现在,我不明白为什么会发生这种情况。我不确定是否final CopyOnWriteArrayList<Integer> intList = new CopyOnWriteArrayList<>();会导致这种影响——如果是这样的话——我根本不知道为什么?

对此主题的任何意见将不胜感激!

使用 Runnable 的匿名实现 - 无法按预期工作

输出(有时 - 因为有线程) 第一个读取线程打印出一些数字,第二个读取线程不会打印出任何数字!

使用自定义线程类 - 按预期工作

输出 - 按预期工作 第一个读取线程打印出一些数字,第二个读取线程打印出所有数字

目前我正在使用 JDK 1.7.0_25 和 Eclipse Mars Release 4.5.0 的 Win10 机器上工作

0 投票
1 回答
641 浏览

java - Java同时在不同的地方修改列表

我有这段代码,我正在使用迭代器遍历 ArrayList,例如:

其中“句柄(元素元素)”如下所示:

现在这给出了一个 ConcurrentModificationException,因为iterator第一个方法中的 没有用新添加的元素更新。

我目前已经使用CopyOnWriteArrayList解决了这个问题,但是这些对于性能来说非常昂贵。有没有更好的方法来解决这个问题?

提前致谢!

(注意:这个例子没有任何意义,只是为了说明我所面临的)


我将尝试解释我为什么这样做:

  • 我的主类中有一个需要执行的“命令”列表

  • 我有一个 while 循环(示例中的代码 1),它遍历这些命令并一个接一个地执行它们,同时在从列表中执行时将它们删除。

  • 在执行命令时,该命令可以依次将新命令添加到保存在我的主类中的列表中。(这实际上有点复杂:处理命令要求客户端做出响应,而客户端又会用命令响应,并且该命令将被添加到保存的列表中)。

0 投票
2 回答
33 浏览

android - 如何将数组列表转换为数组?

我有一个带有 JSON 值的数组列表。我想将其转换为数组,然后将其发送给 MapActivity。我尝试了很多方法,但都失败了。

0 投票
0 回答
18 浏览

java - android中的copyonwritearraylist

众所周知,CopyOnWriteArrayList 可以解决多线程访问 List 的问题,在 Java 中,当我们要更改列表中的值时,它会在内存中进行复制。但是在android中,当我们调用get()这样的方法时,可能会抛出ConcurrentModificationException,这是因为我们在android中调用CopyOnWriteArrayList的subList()时,会生成一个叫CowSubList的对象,它有一个叫Slice的方法.checkConcurrentModification() 并抛出 ConcurrentModificationException。当一个线程将一个项目添加到列表中而另一个正在访问列表时,我该如何解决这个问题?

0 投票
0 回答
248 浏览

java - 处理后 CopyOnWriteArrayList 的线程安全清除

我有一个使用 a 的 Java 程序,该程序CopyOnWriteArrayList正在被一个线程中的一个update()方法迭代,该线程在某个时间间隔上运行并处理列表中的每个项目。列表中的项目不是线程安全的,因此我正在使用各种CopyOnWriteArrayList缓冲区处理对项目的修改,这些缓冲区用于了解要修改哪些项目以及方法何时update()迭代列表。

问题是,一旦我使用了这些缓冲区,我就会使用clear()它们,但我担心在使用缓冲区和清除缓冲区之间可能已经将一个项目添加到缓冲区中。

例如:

示例 2:

我担心synchronize在读取/修改这些列表的代码块周围使用会导致主线程锁定(这是对修改的调用来自哪里),因为在遍历项目期间发生的处理需要一段时间(Python脚本被调用并等待)。这就是我首先使用缓冲区的原因。

有没有比我提到的任何一种方法更好的方法来做到这一点?

请注意,这两个示例都显示了将在方法中运行的代码,该update()方法位于线程的“无限”while 循环中。

更新

似乎 usingConcurrentLinkedQueue将满足示例 2 的问题。但是,似乎在第一个示例中使用它似乎是多余的,因为我基本上只是想将所有节点添加到mainList. 如果ConcurrentLinkedQueue.pollAll()方法就好了!

此外,对于以下示例,我必须从 中迭代地删除项目mainList,我不想这样做,因为它是一个CopyOnWriteArrayList. 虽然我不确定它是否需要再成为一个......

示例 3:

0 投票
2 回答
276 浏览

java - volatile 能保证线程安全吗?这个 ArrayList 示例

我有一个 ArrayList 'X',它被传递给多个线程,每个线程使用 addAll() 向这个 ArrayList 'X' 添加更多数据。显然这里存在多线程问题,一种选择是使代码的 addAll() 部分“同步”(或)使用 copyOnWriteArrayList。

但我的问题是,声明这个 ArrayList 'volatile' 会达到同样的目的吗?JVM 是否相应地对这些读/写指令进行排序并防止多线程问题?

0 投票
2 回答
1517 浏览

java - 同时合并列表 - CopyOnWriteArrayList 或 ConcurrentLinkedQueue 哪个更好?

支持有几个线程运行查询任务,每个线程都会返回一个list结果,哪种数据结构可以更快地合并结果?

并发链接队列

基于链接节点的无界线程安全队列。此队列对元素进行 FIFO(先进先出)排序。队列的头部是在队列中时间最长的元素。队列的尾部是在队列中时间最短的元素。新元素被插入到队列的尾部,队列检索操作获取队列头部的元素。当许多线程将共享对公共集合的访问时,ConcurrentLinkedQueue 是一个合适的选择。与大多数其他并发集合实现一样,此类不允许使用空元素。 此实现采用了一种高效的“无等待”算法,该算法基于简单、快速和实用的非阻塞和阻塞并发队列算法中描述的算法由 Maged M. Michael 和 Michael L. Scott 撰写。

CopyOnWriteArrayList

顾名思义,CopyOnWriteArrayList 使用每个突变操作(例如添加或设置)创建底层 ArrayList 的副本。通常 CopyOnWriteArrayList 非常昂贵,因为它涉及每次写入操作的昂贵 Array 复制,但如果您有一个迭代次数超过突变的列表,例如您主要需要迭代 ArrayList 并且不要经常修改它,那么它非常有效。

0 投票
2 回答
472 浏览

java - ArrayList.TrimToSize() 和 Array 的区别?

一般来说,他们说我们从 Array 转移到 ArrayList 的原因如下

数组是固定大小的,而数组列表不是。

ArrayList 的缺点之一是:

当它达到它的容量时,ArrayList 变成它实际大小的 3/2。因此,如果我们没有正确利用空间,内存可能会被浪费。在这种情况下,数组是首选。

如果我们使用 ArrayList.TrimSize(),那会让 Array List 成为一致的选择吗?消除数组的唯一优势(固定大小)?