0

私はシステムを開発してArrayListいますが、いくつかの場所でそのアクセス権があります(値の挿入、削除、更新)。ArrayListプログラムを実行すると複数の場所にアクセスするため、同時更新エラーが発生します。

同期されているので代わりArrayListに使えます。しかし、私が使用すると、システムのパフォーマンスが低下する原因になりますか? アイデアをください。この問題を解決するにはどうすればよいですか?VectorVectorVector

これは私が得る例外の一部です:

].[localhost].[/uckt].[Faces Servlet]] (http-127.0.0.1-8080-144) 
Servlet.service() for servlet Faces Servlet threw exception: java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source) [:1.7.0_02]
at java.util.ArrayList$Itr.next(Unknown Source) [:1.7.0_02] 
4

4 に答える 4

2

もう 1 つあります。ConcurrentModificationException は、2 つのスレッドを介した実際の同時変更から生成されない場合があります。別の理由が考えられます。

ArrayList を繰り返し処理しているときに、要素を削除する場合があります。これを試してみると

Object o = iterator.next()
if(someCondition)
    arrayList.remove(o)

単一のスレッドでは、ConcurrentModificationException が発生します。その場合、ListIterator と remove メソッドを使用する必要があります。

于 2012-08-13T11:35:53.793 に答える
1

CopyOnWriteArrayListを検討しましたか?

基になる配列の新しいコピーを作成することによって、すべての変更操作 (追加、設定など) が実装される ArrayList のスレッドセーフなバリアント。

いつものように、効率が問題であることがわかるまで、私は効率についてあまり心配しません。

于 2012-08-13T11:06:44.827 に答える
0

Collections#synchronizedCollection(Collection)を参照してください。ArrayListこれは、リスト内の要素を安全に追加/削除/更新するために使用できる同期を返します。

于 2012-08-13T11:10:58.417 に答える
0

アクセスごとに ArrayList を同期することもできます。

synchronize(myList)
{
  myList.add(object);
}
于 2012-08-13T11:15:13.360 に答える