5

Java で ArrayList を返す共有ライブラリを使用しています。それを反復処理すると、ConcurrentModificationException がスローされる可能性があり、100% (?) 保証された安全性を探しています。以下のようなことを考えていたので、ご意見をいただければ幸いです。

data_list は、MT ライブラリから返される ArrayList<> です。

boolean pass = true;

ArrayList<Something> local = new ArrayList<Something>(256);

for (int spin=0; spin<10; ++spin)
{
  try {
    local.addAll(data_list);
  }
  catch (java.util.ConcurrentModificationException ce) {
    pass = false;
  }
  finally {
    if (pass) break;
    pass = true;
  }
}

変数passがであると仮定するとtrue、ローカルでどのように操作すればよいですか?

4

4 に答える 4

0

安全とは何を意味するのかを正確に定義しておらず、リストに対して実行されている変更の種類を指定していませんが、多くの場合、インデックスによって手動で反復処理することが許容される場合があります。

for (int index = 0; index < data_list.size(); index ++)
    local.add(data_list.get(index));

私の見方では、4 種類の変更が可能であり、許容度はさまざまです。

  • 新しいアイテムが追加される可能性があります。このソリューションは、バッキング リストの拡張をトリガーするのに十分なほどリストが大きくならない限り、このケースでは適切に機能するはずです (また、これは指数関数的に減少する頻度で発生するため、発生した場合の再試行は最終的に成功することが保証されるはずです)。
  • 既存のアイテムは変更される場合があります。このソリューションは、常にリストのコンテンツの一貫したビューを提示しない場合がありますが、リストに含まれていたアイテムを代表する使用可能なリストを提供することが保証されます。 "安全"。
  • アイテムは削除される場合があります。このソリューションが IndexOutOfBoundsException で失敗する可能性はわずかですが、一貫性に関しては、アイテムが変更される場合と同じ警告が適用されます。
  • 項目はリストの途中に挿入できます。変更されるアイテムと同じ警告が適用され、重複した値を取得する危険性もあります。追加のケースからのバッキング配列の拡張に関する問題も適用されます。
于 2013-07-01T18:54:18.413 に答える
-2

基本的な変更はありませんが、コードを少し単純化できると思います。

ArrayList<Something> local = new ArrayList<Something>(256);

for (int spin=0; spin<10; ++spin)
{
  try {
    local.addAll(data_list);
    break;
  }
  catch (java.util.ConcurrentModificationException ce) {}
}
于 2013-07-01T18:54:16.407 に答える