Sobes.tech
Middle

İş parçacığı yarışları neden oluşur ve bunlarla nasıl mücadele edilebilir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Yarış koşulları (race conditions), birden fazla akışın (thread) aynı anda değiştirilebilir ortak verilere eriştiği ve nihai sonucun yürütme sırasına bağlı olduğu durumlarda ortaya çıkar. Sorun, akış planlayıcısının herhangi bir zamanda akışı değiştirebilmesi ve kodda atomik görünen bir işlemin başka akışlar tarafından bölümler halinde kesilerek yürütülebilmesidir.

Yarış koşullarıyla mücadele, ortak kaynaklara doğru erişimi sağlamaya indirgenir. Temel yöntemler:

  • Senkronizasyon: Ortak verilerin kullanıldığı kritik bölümlere eşzamanlı erişimi sınırlama. Popüler mekanizmalar:

    • synchronized anahtar kelimesi: Nesne veya sınıf seviyesinde kilit sağlar.
    // Nesne seviyesinde kilit
    synchronized (this) {
        // Kritik bölüm
        sharedData++;
    }
    
    // Sınıf seviyesinde kilit
    synchronized (MyClass.class) {
        // Kritik bölüm
        sharedStaticData++;
    }
    
    • Açık kilitler (Lock arayüzü, ReentrantLock): Daha fazla esneklik sağlar, örneğin, kilidi almaya çalışmak veya zaman aşımı ile almak gibi.
    Lock lock = new ReentrantLock();
    // ...
    lock.lock(); // Kilidi al
    try {
        // Kritik bölüm
        sharedData++;
    } finally {
        lock.unlock(); // Kilidi serbest bırak (mutlaka finally'de)
    }
    
  • Atomik işlemler: java.util.concurrent.atomic paketinden sınıfların kullanılması, bu sınıflar, kilit kullanmadan atomik işlemler (örneğin, artırma, karşılaştırma ve takas) sağlar.

    import java.util.concurrent.atomic.AtomicInteger;
    
    AtomicInteger atomicCounter = new AtomicInteger(0);
    // ...
    atomicCounter.incrementAndGet(); // Atomik artırma
    
  • İş parçacığı güvenli koleksiyonlar: java.util.concurrent paketinden koleksiyonların kullanılması (örneğin, ConcurrentHashMap, CopyOnWriteArrayList), çok iş parçacıklı ortamda çalışmak üzere tasarlanmıştır.

  • Değişmez (Immutable) nesneler: Veriler oluşturulduktan sonra değiştirilemiyorsa, çoklu erişim yarış koşullarına yol açmaz.

  • İş parçacığı Yerel Depolama (Thread-Local Storage): Her iş parçacığının kendi kopyası vardır, böylece ortak erişim sorunu ortadan kalkar.

Yöntem seçimi, duruma ve gereken senkronizasyon seviyesine bağlıdır. Aşırı senkronizasyon, önemli maliyetlere ve hatta deadlock'lara yol açabilir.