Не получается воспроизвести Deadlock

Изучал тему Deadlock в многопоточном программировании. В этом коде, по идее, должен происходить Deadlock:

public class Main {
    public static void main(String[] args) {
        ResourceA resourceA = new ResourceA();
        ResourceB resourceB = new ResourceB();
        resourceA.resourceB = resourceB;
        resourceB.resourceA = resourceA;
        Thread_1 thread_1 = new Thread_1();
        Thread_2 thread_2 = new Thread_2();
        thread_1.resourceA = resourceA;
        thread_2.resourceB = resourceB;
        thread_1.start();
        thread_2.start();
    }
}

class ResourceA {
    ResourceB resourceB;

    public synchronized int getI(){
        return  resourceB.returnI();
    }

    public synchronized int returnI(){
        return 1;
    }
}

class ResourceB {
    ResourceA resourceA;

    protected synchronized int getI(){
        return  resourceA.returnI();
    }

    public synchronized int returnI(){
        return 2;
    }
}

class Thread_1 extends Thread {
    ResourceA resourceA;
    @Override
    public void run() {
        System.out.println(resourceA.getI());
    }
}

class Thread_2 extends Thread {
    ResourceB resourceB;
    @Override
    public void run() {
        System.out.println(resourceB.getI());
    }
}

Но, по непонятным мне причинам, он работает корректно. Объясните, пожалуйста, это я что-то не правильно сделал или java просто уже научилась справляться с такими проблемами?


Ответы (1 шт):

Автор решения: Николай Семенов

Если сделать так, то Deadlock случится

 class ResourceA {
        ResourceB resourceB;
    
        public synchronized int getI(){
            resourceB.returnI();
            Thread.yield();
            return  resourceB.getI();
        }
    
        public synchronized int returnI(){
                return 1;
            }
        }
        
        class ResourceB {
            ResourceA resourceA;
        
            protected synchronized int getI(){
                return  resourceA.returnI();
            }
        
            public synchronized int returnI(){
                return 2;
            }
        }
→ Ссылка