ブロックを使って制御するのが楽です。使ってるから大丈夫だと思っている人は泣いてください。なめたらあかんぜよ!さて、いったい何を言いたいのか良く解らないと思うので簡潔にまとめていないダラダラとしたサンプルコードをご覧ください。List");girlFriends.forEach(System.out::println);}}このプログラムの実行結果は次のような実行時エラーがでます。スレッドで要素を追加し、イテレーション処理を要素を一つ出力させるごとに一秒間スレッドをスリープさせています。スレッドでは、要素の削除処理の開始を一秒遅らせています。内容が変更されてしまいます。何も考えずに並行処理している無残な結果が悲しいですね。使って終わりではつまらないのでもう一つの解決方法を紹介します。ドキュメントには次のように書かれています。基になる配列の新しいコピーを作成することにより、すべての推移的操作(add、setなど)が実装されるArrayListのスレッド・セーフな変数です。通常、これは非常に効率が悪いのですが、トラバーサル操作が変更を数の点で大幅に上回る場合には、代替手段よりも効率が良い場合があります。これは、トラバーサルを同期できない場合や、同期することを望まないが、並行スレッド間の干渉を排除する必要がある場合に有用です。「スナップショット」スタイルのイテレータ・メソッドは、イテレータの作成時点での配列状態への参照を使用します。この配列がイテレータの有効期間中に変更されることは決してないため、干渉は不可能であり、イテレータはConcurrentModificationExceptionをスローしないことが保証されます。イテレータは、イテレータの作成以降のリストへの追加、削除、または変更を反映しません。イテレータ自体に対する要素変更操作(remove、setおよびadd)はサポートされません。これらのメソッドは、UnsupportedOperationExceptionをスローします。nullを含むすべての要素が許可されます。別のスレッドでのその要素へのアクセスまたはCopyOnWriteArrayListからの削除に続くアクションよりも前に発生します。今回のケースではお手軽に使えそうですね。言うことでまたダラダラとコードをご覧ください。変更するだけなのでやめておきます。アップしておきますので見たい方はどうぞ。https://github.com/Yucchi-1995/GirlFriendsプログラムの実行結果は次のようになります。投げられることなく並行処理が完了しています。スレッドのイテレーション処理出力がそのとおりに出力されているのが確認できます。要素は「堀北真希」の一つとなります。スレッドに戻ってから「綾瀬はるか」が追加され出力されているからです。追加する予定だったのをすっかり忘れてしまったことです。