Java’da Deadlock

sametklou

Java’da Deadlock

Java programlama dilinde deadlock, iki veya daha fazla iş parçacığının birbirini beklemesi sonucunda gerçekleşen bir durumdur. Deadlock, bir iş parçacığının diğer bir iş parçacığının kaynağı serbest bırakmasını beklediği durumda oluşur.

Deadlock Nasıl Oluşur?

Deadlock durumu genellikle dört temel koşulun bir araya gelmesi sonucunda oluşur:

  1. Karşılıklı dışlama (Mutual Exclusion): Bir kaynağa aynı anda sadece bir iş parçacığının erişebilmesi.
  2. Tutarlılık (Hold and Wait): Bir iş parçacığı kaynağı elinde tutarken başka bir kaynağa erişmek için beklemesi.
  3. Döner Bekleme (Circular Wait): İş parçacıkları arasında karşılıklı döngüsel bir bekleme durumu.
  4. Kaynak Sıralaması (Resource Allocation Order): Kaynaklara erişim sıralarının belirlenmemesi.

Deadlock Örnekleri ve Nasıl Önlenir?

Java programlama dilinde deadlock durumu örneği aşağıdaki gibi olabilir:

public class DeadlockExample {
    private static Object resource1 = new Object();
    private static Object resource2 = new Object();

    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            synchronized (resource1) {
                System.out.println("Thread 1: Holding resource 1...");

                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                }

                System.out.println("Thread 1: Waiting for resource 2...");

                synchronized (resource2) {
                    System.out.println("Thread 1: Holding resource 1 and 2...");
                }
            }
        });

        Thread thread2 = new Thread(() -> {
            synchronized (resource2) {
                System.out.println("Thread 2: Holding resource 2...");

                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                }

                System.out.println("Thread 2: Waiting for resource 1...");

                synchronized (resource1) {
                    System.out.println("Thread 2: Holding resource 1 and 2...");
                }
            }
        });

        thread1.start();
        thread2.start();
    }
}

Deadlock durumunu önlemek için aşağıdaki yöntemler kullanılabilir:

  • Kaynakları sıralamak: Kaynaklara erişim sıralarını belirleyerek deadlock durumunu önlenebilir.
  • İşlemi bölme: Uzun işlemleri küçük parçalara bölmek ve kaynakları minimum süre boyunca tutmak.
  • Wait-for graph: İş parçacıkları arasındaki bekleme durumlarını belirleyerek ve çözümlemek.

Deadlock durumları, Java programlama dilinde etkili bir şekilde yönetilmeli ve önlenmelidir. Yapılan örnekler ve detaylı açıklamalarla bu durumların daha iyi anlaşılmasını sağlamak önemlidir.