まず、ArrayListのドキュメントはスレッドセーフではないと言います。そのような場合には使用しないことをお勧めします。さらに、理論的にはうまくいきましたが、このプログラムを管理している人は誰でも読んだり書いたりした厳しい制約を覚えています。それはあなたの質問が理論的な観点から本当に面白いので、私は見てみると思った。
最初に注意しなければならないのは、読者がイテレータを使用してリストにアクセスしようとしたとき、遅かれ早かれ、ConcurrentModificationExceptionで読み込みが失敗することです。これは、リストへのすべての変更が追跡され、イテレータがイテレータの外で修正を検出した場合には高速で失敗するためです。
これは、オリジナルの質問にイテレータを使用する必要性を指定していないため、get()およびsize()を追加して読み込むだけで自分自身を制限するとどうなりますか?この場合、内部的にリストに現在のサイズがバッキングデータ配列とともに格納されていて、どちらの変数もvolatileとしてマークされていないため、時折エラーが発生することがあります。その結果、(Javaのメモリ保証のために)データがまだ更新されていない間に読者のスレッドの1つが更新されたサイズの変数を見ることが理論的には可能だと思います。この場合、返される迷惑データや、indexOutOfBoundsを終了させる可能性があります。
「素晴らしい並列構造」... [ReadWriteLock'](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReadWriteLock.html)です。実装するのは些細なことです。 – aioobe
オブジェクトに変異がありますか?チック。それは複数のスレッドによってアクセスされますか?チック。オブジェクトにスレッドセーフの保証が付いていますか?いいえ、おめでとうございます。何らかの同期が必要です。チェックリストは本当に簡単です。 – biziclop
広告掲載オーダーは気になりますか? – Makoto