我有一个使用CopyOnWriteArrayList
的Java程序,该程序在某个时间间隔内运行的线程中由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()
方法中运行的代码,该方法位于线程的“无限”循环中。
更新
似乎使用ConcurrentLinkedQueue
将满足示例2的问题。但是,似乎在第一个示例中使用它会有点过分,因为我基本上只想将所有节点添加到{{ 1}}。如果mainList
有ConcurrentLinkedQueue
方法,那就太棒了。
此外,对于以下示例,我必须迭代删除.pollAll()
中的项目,我不想这样做,因为它是mainList
。虽然我不确定它是否需要再成为一个......
示例3:
CopyOnWriteArrayList