Sobes.tech
Junior — Middle

Java'da ConcurrentModificationException istisnosining yuzaga kelishi nima va qaysi holatlarda chiqarilishi mumkin?

sobes.tech AI

AIdan javob

Java'da ConcurrentModificationException istisnası, koleksiyon üzerinde yineleme sırasında koleksiyonun yapısal bir değişikliğinin (örneğin, öğe ekleme veya kaldırma) doğrudan koleksiyon metodlarıyla değil, yineleyici kullanmadan yapılması durumunda ortaya çıkar. Bu fail-fast mekanizması, potansiyel olarak tehlikeli değişiklikler hakkında uyarır ve yineleyicinin hatalı çalışmasına neden olabilir.

Bu istisna genellikle şu durumlarda atılır:

  • Bir ArrayList üzerinde Iterator kullanılarak yineleme yapılırken, döngü içinde list.remove() doğrudan çağrılır, iterator.remove() yerine.
  • Yineleme sırasında başka bir iş parçacığından koleksiyon değiştirilir ve uygun senkronizasyon yapılmaz.

Örnek:

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

Yineleme sırasında güvenli silme yöntemi:

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String s = iterator.next();
    if (s.equals("b")) {
        iterator.remove(); // güvenli
    }
}