私はCollections.Synchronizedlist()
を使用して、arraylist
をスレッドセーフにしています。私がお聞きしたいのは端からリストを反復処理しながら、すなわち削除し、次のコードをスレッドセーフである: -Collections.synchronizedlist()は、反復処理中に要素を削除します。
pendingExecutionList = Collections.synchronizedList(new ArrayList<>(initialCapacity));
私はメインスレッドでリストを作成しています。異なるスレッドからこのリストに追加します。しかし、反復及び除去以下に示すように、単一のスケジュールスレッドから行われている: -
for (int i = pendingExecutionList.size() - 1; i >= 0; i--)
{
if (someCondition(pendingExecutionList.get(i)))
{
process(pendingExecutionList.remove(i));
}
}
複数のスレッドがこのリストに追加されている間、上記のコードは、単一のスレッドによって実行されます。
synchronized(list)
以上の反復子は、フェイルセーフではないので、使用しないでください。
答えはhttp://stackoverflow.com/questions/9468187/collections-synchronizedlist-and-synchronized – alphablue
にあります。いいえ、スレッドセーフではありません。[The javadoc](http://docs.oracle.com/jp/) com/javase/8/docs/api/java/util/Collections.html#synchronizedList-java.util.List-)は非常に明確です:*ユーザが反復処理をするときに返されたリストを手動で同期させることが不可欠です*。 –
なぜですか? – maveroid