我正在使用多线程批量处理字符串列表,但是当 Runnable 任务迭代列表以处理每个字符串时,我收到了这个错误。
例如代码大致遵循这样的结构:
public class RunnableTask implements Runnable {
private List<String> batch;
RunnableTask(List<String> batch){
this.batch = batch;
}
@Override
public void run() {
for(String record : batch){
entry = record.split(",");
m = regex.matcher(entry[7]);
if (m.find() && m.group(3) != null){
currentKey = m.group(3).trim();
currentValue = Integer.parseInt(entry[4]);
if ( resultMap.get(currentKey) == null ){
resultMap.put(currentKey, currentValue);
} else {
resultMap.put(currentKey, resultMap.get(currentKey) + currentValue);
}
}
}
}
}
传递这些批处理进行处理的线程从不修改“批处理”,并且在 for 循环内不对批处理进行任何更改。我知道这个异常 ConcurrentModificationException 是由于在迭代期间修改了列表,但据我所知,这并没有发生。有什么我想念的吗?
任何帮助表示赞赏,
谢谢!
UPDATE1:似乎实例变量不是线程安全的。我尝试使用 CopyOnWriteArrayList 代替 ArrayList 但收到不一致的结果 - 表明在以某种方式修改列表之前完整迭代没有完成,并不是每个元素都在处理。
UPDATE2:使用 sychronized 和/或 reentrantlock 锁定循环仍然会给出相同的异常。
我需要一种将列表传递给可运行任务的方法,并在没有新线程的情况下迭代这些列表,从而导致该列表出现并发问题。