Sobes.tech
Middle

İş parçacığı yarışmaları neden ortaya çıkar ve bunlarla mücadele etmek için hangi yöntemler vardır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Yarış koşulları (race conditions), birden fazla akışın aynı anda paylaşılan değiştirilebilir verilere eriştiği ve yürütme sırasına bağlı olarak sonucun değiştiği durumlarda ortaya çıkar. Bu, işletim sisteminin herhangi bir zamanda akışları değiştirebilmesi ve yürütmelerini kesintiye uğratabilmesi nedeniyle olur.

Bunlarla mücadele yolları:

  • Senkronizasyon: Paylaşılan kaynaklara özel erişimi sağlamak için senkronizasyon primitive'lerinin kullanılması.

    • synchronized anahtar kelimesi: Metotlara veya kod bloklarına uygulanır. Mevcut akış tamamlanana kadar diğer akışların nesne veya sınıfa erişimini engeller.

      // Senkronize metot
      public synchronized void updateData(int newValue) {
          // ... paylaşılan verilerin güncellenmesi
      }
      
      // Kod bloğu senkronizasyonu
      public void processData() {
          synchronized (this) { // veya başka bir monitor nesnesi
              // ... paylaşılan verilere erişim
          }
      }
      
    • Lock kullanımı: synchronized'a kıyasla daha esnek kontrol sağlar.

      import java.util.concurrent.locks.Lock;
      import java.util.concurrent.locks.ReentrantLock;
      
      private final Lock dataLock = new ReentrantLock();
      
      public void safeUpdateData(int newValue) {
          dataLock.lock(); // Kilidi al
          try {
              // ... paylaşılan verilerin güncellenmesi
          } finally {
              dataLock.unlock(); // Kilidi serbest bırak
          }
      }
      
  • Atomik değişkenler (Atomic...): İş parçacığı güvenli işlemler sağlar, açık kilit kullanmadan primitive tipler üzerinde. Basit işlemler (arttırma, karşılaştırma ve değiş tokuş) için kullanılır.

    import java.util.concurrent.atomic.AtomicInteger;
    
    private final AtomicInteger counter = new AtomicInteger(0);
    
    public void incrementCounter() {
        counter.incrementAndGet(); // Atomik artış
    }
    
  • İş parçacığı güvenli koleksiyonlar: java.util.concurrent paketinden özel koleksiyonlar kullanılır (örneğin, ConcurrentHashMap, CopyOnWriteArrayList), çoklu iş parçacığı erişimine uygun.

    import java.util.concurrent.ConcurrentHashMap;
    import java.util.Map;
    
    private final Map<String, Integer> safeMap = new ConcurrentHashMap<>();
    
  • Değişmez (Immutable) nesneler: Oluşturulduktan sonra değişmeyen veriler, senkronizasyon olmadan birden fazla iş parçacığı tarafından güvenle erişilebilir.

  • ThreadLocal kullanımı: Her iş parçacığına kendi kopyası atanır, böylece erişim rekabeti önlenir.

    private final ThreadLocal<Integer> threadId = new ThreadLocal<>();
    
    public void setThreadId() {
        threadId.set(Thread.currentThread().getId());
    }
    
    public int getThreadId() {
        return threadId.get();
    }
    
  • Doğru mimari tasarım: Paylaşılan değişken verileri en aza indirmek ve iş parçacıkları arasında mesaj iletimi veya asenkron yaklaşımlar kullanmak, yarış koşullarını azaltabilir.