質問: new CopyOnWriteArraySet(); に変えるとスレッドセーフとなるため例外が発生しないことも知っています。C,D追加の変更は反映されませんが。 言葉ではわかっているけどロジック的に理解できていないような感じです。 アドバイスいただけると幸いです。よろしくお願い致します。
回答: イテレータオブジェクトは元になったオブジェクトのことを見ています。 具体的には「あのオブジェクトの、バージョン○○のときの○番目まで取り出した」という情報を格納しています。 元オブジェクトに改変が加わった時点で元オブジェクトは自身のバージョン番号を上げる(このバージョン番号という数値はパッケージローカールなので利用者からはアクセスできないものです)ので、イテレータは値を取り出そうとして「バージョン番号が違うじゃん!」と怒って例外を投げる、そんな仕組みです。