java.util.ConcurrentModificationExceptionが発生するケース

以前、Javaのコレクションクラス(確かjava.util.ArrayList)とそれから取得したIteratorを使っていたときに、Iteratorを使って見つけた要素を元のコレクションクラスから削除する処理を実装していたときにちょっとはまったので、そのときのメモ。だいぶ前のことだけど。
コレクションクラスからIteratorを取得して、そのIteratorから要素を取り出し、要素がある条件を満たしていれば元のコレクションから削除するという処理を書きたかったんだ。そこでまず、次のようなコードを書いた。

Iterator itr = list.iterator();
while (itr.hasNext()) {
  Message msg = itr.next();
  if (msg.getTimestamp() < this.threshold_time) {
    boolean res = list.remove(msg);
    if (!res) throw new Exception("Message remove");
  }
}

4行目のif文がTRUEなら大元のlistから直にMessageを削除している。しかし、このコードを実行すると5行目でConcurrentModificationExceptionが投げられた。初めて見る例外。名前からして、スレッドなどで同時にこのlistクラスへアクセスしたかのような印象を受けたが、そんなことはしていない、現段階ではシングルスレッドで実装していた。
そこで、何でだろうとドキュメントに目を通したところ、やはりマルチスレッドでコレクションクラスに対して平行アクセスした場合にも投げられるんだけど、以下の引用のように、今回僕がやったような処理をすると投げられてしまうらしい。

If a single thread issues a sequence of method invocations that violates the contract of an object, the object may throw this exception. For example, if a thread modifies a collection directly while it is iterating over the collection with a fail-fast iterator, the iterator will throw this exception.

http://java.sun.com/javase/6/docs/api/java/util/ConcurrentModificationException.html

だったら、名前がちょっといまいちなような。「CollectionStateChangedException」とかの方がいいような気もしないでも無いけど、1.2からある例外クラスだから変更できないか。
ちなみに、Iteratorインターフェースにはremoveメソッドが定義されている。これは直前にnext()で取得したオブジェクトをコレクションから削除するメソッド。だけど、このメソッドの実装は任意だということで(from Java Doc)、場合によっては実装されていないのかもしれないと思い最初は使っていなかったんだけど、Java処理系付属のライブラリ群には実装されていると考えても良いのかな?