2

私の知る限り、1つのスレッドがコレクションを反復し、別のスレッドがコレクションを変更するときにConcurrentModificationExceptionを回避する方法は2つあります。

  1. クライアントロック、基本的に反復中にコレクションをロックします。コレクションにアクセスする必要がある他のスレッドは、反復が完了するまでブロックされます。
  2. コレクションのクローンを作成し、コピーを反復する「スレッド制限」。

他に選択肢はありますか?最初の方法は明らかであり、パフォーマンスの面で望ましくなく、パフォーマンスが低いためです。コレクションが大きい場合、他のスレッドが長時間待機する可能性があります。2番目の方法では、コレクションのクローンを作成してコピーを繰り返すので、他のスレッドが入って元のスレッドを変更すると、コピーされたスレッドが古くなるかどうかわかりません。それは、クローンを作成して再起動し、変更したらもう一度繰り返す必要があることを意味しますか?

4

2 に答える 2

7

私は他の選択肢があるのだろうか?

この例外をスローしない並行コレクションの 1 つを使用してください。代わりに、弱い整合性を提供します。つまり、反復中に追加または削除要素が表示される場合と表示されない場合があります。

http://docs.oracle.com/javase/tutorial/essential/concurrency/collections.html

java.util.concurrent パッケージには、Java Collections Framework への多数の追加機能が含まれています。これらは、提供されるコレクション インターフェイスによって最も簡単に分類されます。

  • BlockingQueue は、満杯のキューに追加しようとしたとき、または空のキューから取得しようとしたときにブロックまたはタイムアウトする先入れ先出しデータ構造を定義します。
  • ConcurrentMap は、便利なアトミック操作を定義する java.util.Map のサブインターフェースです。これらの操作は、キーが存在する場合にのみキーと値のペアを削除または置換し、キーが存在しない場合にのみキーと値のペアを追加します。これらの操作をアトミックにすることで、同期を回避できます。ConcurrentMap の標準的な汎用実装は ConcurrentHashMap で、これは HashMap の並行アナログです。
  • ConcurrentNavigableMap は、近似一致をサポートする ConcurrentMap のサブインターフェースです。ConcurrentNavigableMap の標準的な汎用実装は ConcurrentSkipListMap で、これは TreeMap の並行アナログです。
于 2012-12-17T15:44:30.237 に答える
0

CopyOnWriteArrayListのようなjava.util.Concurrentのクラスを使用できます

于 2012-12-17T15:43:36.090 に答える