0Pricing
Java Academy · Ders

Fail-Fast ve Fail-Safe Yineleyiciler

ConcurrentModificationException'ı ve fail-fast davranışını anlayın; anlık görüntü yineleyicilerinin ne zaman kullanılacağını öğrenin.

Fail-Fast ve Fail-Safe Yineleyiciler, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Erken Hata Veren ve Hata Güvenli Yineleyiciler

Java yineleyicileri, temel koleksiyon dolaşım sırasında değiştirildiğinde gösterdikleri davranışa göre sınıflandırılır: erken hata veren yineleyiciler hemen hata fırlatır; hata güvenli yineleyiciler bir anlık görüntü üzerinde çalışmaya devam eder.

Erken Hata Veren Yineleyiciler

Standart Java koleksiyonlarının çoğu (ArrayList, HashMap, TreeSet) erken hata veren yineleyiciler kullanır. Bu yineleyiciler bir modCount değerini, yani değişiklik sayacını izler. Dolaşım sırasında yapılan herhangi bir yapısal değişiklik ConcurrentModificationException tetikler.

import java.util.*;

List<String> list = new ArrayList<>(List.of("a", "b", "c"));

try {
    for (String s : list) {
        list.add("x"); // structural modification — throws!
    }
} catch (ConcurrentModificationException e) {
    System.out.println("ConcurrentModificationException caught!");
}
// Same for HashMap, TreeMap, HashSet, etc.

Erken Hata Verme Davranışı Neden Var

Erken hata verme davranışı bir hata ayıklama aracıdır; dolaşımın bozuk durumla devam etmesine izin vermek yerine hataları hemen ortaya çıkarır. Bunun alternatifi olan sessiz bozulmanın hata ayıklaması çok daha zordur.

// modCount is incremented on every structural change
// (add, remove, clear on ArrayList)
// Iterator records modCount on creation
// On each next(), Iterator checks: if current modCount != expected, throw CME

// This detects bugs like:
List<Integer> nums = new ArrayList<>(List.of(1,2,3,4,5));
for (Integer n : nums) {
    if (n == 3) nums.remove(n); // bug caught immediately
}
// ConcurrentModificationException — not silent wrong results

Güvenli Silme: Iterator.remove()

Yineleyici tabanlı dolaşım sırasında yapılabilecek tek güvenli değişiklik Iterator.remove() işlemidir; bu işlem, döndürülen son öğeyi siler ve modCount değerini günceller.

List<Integer> nums = new ArrayList<>(List.of(1,2,3,4,5,6));
Iterator<Integer> it = nums.iterator();

while (it.hasNext()) {
    int n = it.next();
    if (n % 2 == 0) it.remove(); // safe: updates modCount
}

System.out.println(nums); // [1, 3, 5]

removeIf: Modern Alternatif

Java 8, Collection'a removeIf(Predicate) yöntemini ekledi. Bu yöntem, el ile yineleyici yönetimi yapmadan bir koşulla eşleşen öğeleri silmenin daha temiz bir yoludur.

List<String> names = new ArrayList<>(List.of("Alice", "Bob", "Ann", "Charlie"));

// Modern: removeIf handles iteration internally
names.removeIf(name -> name.startsWith("A"));
System.out.println(names); // [Bob, Charlie]

// Equivalent but verbose iterator approach:
Iterator<String> it = names.iterator();
while (it.hasNext()) {
    if (it.next().startsWith("A")) it.remove();
}

Hata Güvenli Yineleyiciler: CopyOnWriteArrayList

CopyOnWriteArrayList, hata güvenli bir yineleyici kullanır. Yineleyici oluşturulduğu anda alınan bir anlık görüntü üzerinde dolaşır; değişiklikler devam eden dolaşımı etkilemez.

import java.util.concurrent.CopyOnWriteArrayList;

CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.addAll(List.of("a", "b", "c"));

for (String s : list) {
    list.add("x"); // no ConcurrentModificationException!
    System.out.print(s + " "); // prints a, b, c (snapshot)
}
System.out.println();
System.out.println(list); // [a, b, c, x, x, x] — modified copy

ConcurrentHashMap Yineleyicisi

ConcurrentHashMap, zayıf tutarlılığa sahip yineleyiciler kullanır. Bu yineleyiciler, yineleyici oluşturulduğu sırada veya sonrasında bir noktadaki durumu yansıtır; CME fırlatmaz ve eşzamanlı güncellemeleri görüp görmeyeceği kesin değildir.

import java.util.concurrent.ConcurrentHashMap;

ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("a", 1); map.put("b", 2); map.put("c", 3);

for (Map.Entry<String, Integer> e : map.entrySet()) {
    map.put("d", 4); // no CME — weakly consistent
    System.out.println(e.getKey() + "=" + e.getValue());
}
// May or may not print "d=4" — weakly consistent

Collections.synchronizedList

Collections.synchronizedList hata güvenli DEĞİLDİR; yine de erken hata veren yineleyiciler kullanır, ancak eşzamanlı erişimi engeller. Dolaşım sırasında eşzamanlamayı el ile sağlamanız gerekir.

import java.util.*;

List<String> syncList = Collections.synchronizedList(new ArrayList<>());
syncList.addAll(List.of("a", "b", "c"));

// Must synchronize during iteration!
synchronized (syncList) {
    for (String s : syncList) {
        System.out.println(s);
    }
}
// Without the synchronized block, CME is still possible from another thread

Anlık Görüntü Yineleyicisi Deseni

Eşzamlama kullanmadan değiştirilebilir bir koleksiyon üzerinde güvenle dolaşmak için el ile bir anlık görüntü oluşturun.

import java.util.*;

List<String> original = new ArrayList<>(List.of("a", "b", "c"));

// Take a snapshot copy before iterating
List<String> snapshot = List.copyOf(original);

for (String s : snapshot) {
    // Safe to modify original during snapshot iteration
    original.remove(s);
    System.out.println("Removed: " + s);
}
System.out.println(original); // []

CopyOnWrite Ödünleşimleri

CopyOnWriteArrayList hata güvenlidir, ancak yazma işlemleri açısından maliyetlidir. Her değişiklik tam bir kopya oluşturur.

  • Şunlar için iyi: çok sayıda okuma, seyrek yazma (olay dinleyicisi listeleri)
  • Şunlar için kötü: sık değişiklik, büyük koleksiyonlar

Özet: Erken Hata Veren ve Hata Güvenli

Karşılaştırma özeti:

  • Erken hata veren: ArrayList, HashMap, TreeMap; değişiklikte CME fırlatır, modCount denetimi yapar
  • Hata güvenli/zayıf tutarlılığa sahip: ConcurrentHashMap, CopyOnWriteArrayList; CME fırlatmaz, anlık görüntü veya eşzamanlı veriler üzerinde dolaşır
  • Güvenli değişiklik yöntemleri: Iterator.remove(), removeIf(), replaceAll()

Uygulama: Süresi Dolmuş Session Temizleme

Uygun desenleri kullanarak eşzamanlı bir listeden süresi dolmuş oturumları güvenle silme.

import java.util.*;
import java.util.concurrent.*;

class SessionManager {
    private final CopyOnWriteArrayList<Session> sessions = new CopyOnWriteArrayList<>();

    record Session(String id, long expiresAt) {
        boolean isExpired() { return System.currentTimeMillis() > expiresAt; }
    }

    void add(Session s) { sessions.add(s); }

    // Safe to call from multiple threads while iterating
    void purgeExpired() {
        sessions.removeIf(Session::isExpired);
    }

    List<Session> active() {
        return sessions.stream().filter(s -> !s.isExpired()).toList();
    }
}

Hızlı Denetim

Dolaşım sırasında bir ArrayList değiştirildiğinde hangi özel durum fırlatılır?

Özet: Erken Hata Veren ve Hata Güvenli Yineleyiciler

Temel çıkarımlar:

  • Erken hata veren yineleyiciler (ArrayList, HashMap), eşzamanlı değişiklikte ConcurrentModificationException fırlatır
  • Hata güvenli yineleyiciler (CopyOnWriteArrayList, ConcurrentHashMap), hata fırlatmadan değişikliğe izin verir
  • Erken hata veren dolaşım sırasında silme yapmanın tek güvenli yolu Iterator.remove() yöntemidir
  • removeIf(), el ile Iterator.remove() kullanımına modern ve daha temiz bir alternatiftir
  • CopyOnWriteArrayList: okuma ağırlıklı, yazmanın seyrek olduğu senaryolar için güvenlidir
  • ConcurrentHashMap: zayıf tutarlılığa sahiptir; CME fırlatmaz, eşzamanlı değişiklikleri görüp görmeyebilir

Sıkça Sorulan Sorular

“Fail-Fast ve Fail-Safe Yineleyiciler” dersi ücretsiz mi?

Evet — “Fail-Fast ve Fail-Safe Yineleyiciler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Fail-Fast ve Fail-Safe Yineleyiciler” dersinde ne öğreneceğim?

ConcurrentModificationException'ı ve fail-fast davranışını anlayın; anlık görüntü yineleyicilerinin ne zaman kullanılacağını öğrenin. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Fail-Fast ve Fail-Safe Yineleyiciler” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Iterable ve Iterator Sözleşmeleri
  2. Özel Bir Iterator Uygulama
  3. ListIterator ve Çift Yönlü Gezinme
  4. Fail-Fast ve Fail-Safe Yineleyiciler
← Java Academy Sayfasına Dön