マルチスレッドを使用して文字列のリストをバッチで処理していますが、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:インスタンス変数はスレッドセーフではないようです。ArrayList の代わりに CopyOnWriteArrayList を使用しようとしましたが、一貫性のない結果を受け取りました。これは、リストが何らかの方法で変更される前に完全な反復が完了せず、すべての要素が処理されていないことを示唆しています。
UPDATE2:同期化および/または再入可能ロックを使用してループをロックすると、両方とも同じ例外が発生します。
Lists を Runnable タスクに渡し、新しいスレッドがそのリストで同時実行の問題を引き起こすことなく、それらのリストを反復処理する方法が必要です。