この状況で何が起こるかは、2番目のリスト要素を削除することです。
List<String> list = new ArrayList<String>
        (Arrays.asList("noob1", "noob2", "noob3", "noob4"));
System.out.println(list);
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
    String str = iterator.next();
    if (str.equals("noob3")) {
        System.out.println("Checking "+str);
        list.remove(str);
    }
}
System.out.println(list);
プリント
[noob1, noob2, noob3, noob4]
Checking noob1
Checking noob2
Checking noob3
[noob1, noob2, noob4]
最後から2番目の要素を削除することにより、サイズを繰り返した要素の数に減らしました。
// from ArrayList.Itr
    public boolean hasNext() {
        return cursor != size;
    }
これにより、で同時変更チェックが実行される前に、ループが早期に終了しnext()ます。他の要素を削除するnext()と、が呼び出され、CMEが取得されます。
ところで、チェックをバイパスするものは
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
    String str = iterator.next();
    System.out.println("Checking "+str);
    if (str.equals("noob2")) {
        list.remove("noob1");
        list.remove("noob3");
    }
}
コレクションのサイズが最大のインデックスと同じである限り、チェックは実行されません。