我有一个使用 a 的 Java 程序,该程序CopyOnWriteArrayList
正在被一个线程中的一个update()
方法迭代,该线程在某个时间间隔上运行并处理列表中的每个项目。列表中的项目不是线程安全的,因此我正在使用各种CopyOnWriteArrayList
缓冲区处理对项目的修改,这些缓冲区用于了解要修改哪些项目以及方法何时update()
迭代列表。
问题是,一旦我使用了这些缓冲区,我就会使用clear()
它们,但我担心在使用缓冲区和清除缓冲区之间可能已经将一个项目添加到缓冲区中。
例如:
mainList.addAll(bufferAddList);
bufferAddList.clear();
示例 2:
for (Item item : mainList) { // Main iterator loop
if (bufferModItemList.contains(item)) {
item.modify();
}
// Do other stuff
}
bufferModItemList.clear();
我担心synchronize
在读取/修改这些列表的代码块周围使用会导致主线程锁定(这是对修改的调用来自哪里),因为在遍历项目期间发生的处理需要一段时间(Python脚本被调用并等待)。这就是我首先使用缓冲区的原因。
有没有比我提到的任何一种方法更好的方法来做到这一点?
请注意,这两个示例都显示了将在方法中运行的代码,该update()
方法位于线程的“无限”while 循环中。
更新
似乎 usingConcurrentLinkedQueue
将满足示例 2 的问题。但是,似乎在第一个示例中使用它似乎是多余的,因为我基本上只是想将所有节点添加到mainList
. 如果ConcurrentLinkedQueue
有.pollAll()
方法就好了!
此外,对于以下示例,我必须从 中迭代地删除项目mainList
,我不想这样做,因为它是一个CopyOnWriteArrayList
. 虽然我不确定它是否需要再成为一个......
示例 3:
mainList.removeAll(bufferRemoveList);
bufferRemoveList.clear();