Sobes.tech
Junior — Middle

Java'da ConcurrentModificationException istisnasının oluşması ne anlama gelir ve hangi durumlarda atılabilir?

sobes.tech yapay zeka

AI'dan gelen yanıt

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
    }
}