Um das nochmal zu betonen: Das "fail fast" bedeutet, dass es sofort FAILt, wenn eine "Concurrent Modification" festgestellt wurde. Wenn man z.B. in einem Thread einen Iterator durch eine Liste mit Elementen A,B,C,D,E laufen läßt...
Iterator bei A
Iterator bei B
Iterator bei C
...
Und dann ein anderer Thread das Element A löscht, dann KÖNNTE das dem ersten Iterator eigentlich egal sein - er könnte einfach weiterlaufen...:
Iterator bei D
Iterator bei E
Weil das aber Implementierungsabhängig ist, und in anderen Fällen zu Problemen führen könnte (und sicher auch würde), wird "fail fast" verwendet, und der erste Iterator wird beim Versuch, von C nach D zu laufen eine ConcurrentModificationException werfen.
Nach dem Motto: Lieber früh bescheid sagen, dass irgendwas nicht stimmt, als "auf gut Glück" weiterzumachen, und vielleicht irgendeinen anderen (schwer nachvollziehbaren und/oder kaum reporoduzierbaren) Fehler zu verursachen.