Sobes.tech
Junior — Middle

Čo znamená vznik výnimky ConcurrentModificationException v Jave a v akých situáciách môže byť vyhodená?

sobes.tech AI

Odpoveď od AI

Výnimka ConcurrentModificationException v Jave nastáva, keď počas iterácie cez kolekciu dôjde k jej štrukturálnej zmene (napríklad pridanie alebo odstránenie prvkov), nie prostredníctvom iterátora, ale priamo pomocou metód kolekcie. Tento mechanizmus fail-fast upozorňuje na potenciálne nebezpečné zmeny, ktoré môžu viesť k nesprávnemu správaniu iterátora.

Typické situácie, kedy sa táto výnimka vyvolá:

  • Iterácia cez ArrayList pomocou Iterator, a v cykle sa volá list.remove() priamo, namiesto iterator.remove().
  • Modifikácia kolekcie z iného vlákna počas iterácie bez synchronizácie.

Príklad:

List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
for (String s : list) {
    if (s.equals("b")) {
        list.remove(s); // vyvolá `ConcurrentModificationException`
    }
}

Správny spôsob odstraňovania počas iterácie:

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String s = iterator.next();
    if (s.equals("b")) {
        iterator.remove(); // bezpečné
    }
}