があり、このセットの値をループConcurrentSKipListSet
で反復処理しています。for-each
ある時点で、別のスレッドがこのセットから要素を削除しようとしています。
1 つのスレッドが、まだ反復処理を行っていない (または反復処理を開始したばかりの) 要素を削除し、ループ内からの呼び出しが失敗する状況に陥っていると思います。
わかりやすくするためのコード:
for(Foo foo : fooSet) {
//do stuff
//At this point in time, another thread removes this element from the set
//do some more stuff
callService(foo.getId()); // Fails
}
ドキュメントを読んでも、これが可能かどうかはわかりません:
イテレータは弱一貫性であり、イテレータの作成時または作成後のある時点でのセットの状態を反映する要素を返します。それらは をスローせず
ConcurrentModificationException
、他の操作と同時に進行する場合があります。
これは可能ですか?もしそうなら、これを処理する良い方法は何ですか?
ありがとう
意思