有没有办法阻止 ListIterator 抛出 ConcurrentModificationException?
您以这种方式提出这个问题表明对如何正确使用线程来提高应用程序的性能缺乏了解。
使用线程的全部目的是将处理和 IO 划分为单独的可运行实体,这些实体可以并行执行——彼此独立。如果您将线程分叉以使所有线程都在同一工作,LinkedList
那么您很可能会损失性能或获得最小的收益,因为保持每个线程的“视图”同步所需的同步开销LinkedList
将抵消由于以下原因而产生的任何收益并行执行。
问题不应该是“我如何停止ConcurrentModificationException
”,而应该是“我如何使用线程来改进对象列表的处理”。这是正确的问题。
要与多个线程并行处理对象集合,您应该使用ExecutorService
线程池。您可以使用类似于以下代码的内容创建池。LinkedList
然后(在此示例中)中的每个条目Job
将由池中的线程并行处理。
// create a thread pool with 10 workers
ExecutorService threadPool = Executors.newFixedThreadPool(10);
// submit each of the objects in the list to the pool
for (Job job : jobLinkedList) {
threadPool.submit(new MyJobProcessor(job));
}
// once we have submitted all jobs to the thread pool, it should be shutdown
threadPool.shutdown();
// wait for the thread-pool jobs to finish
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
synchronized (jobLinkedList) {
// not sure this is necessary but we need to a memory barrier somewhere
}
...
// you wouldn't need this if Job implemented Runnable
public class MyJobProcessor implements Runnable {
private Job job;
public MyJobProcessor(Job job) {
this.job = job;
}
public void run() {
// process the job
}
}