Sobes.tech
Middle — Middle+

შექმენით კოდის მაგალითი, რომელიც გამოიწვევს მჭიდროდ შეზღუდულ თრიქებს, რომლებსაც ვერ გაათავისუფლებენ.

sobes.tech AI

პასუხი AI-სგან

ქვემოთ მოცემულია Java კოდის მაგალითი, რომელიც აჩვენებს ურთიერთმკაცრობას (deadlock) ორ ნაკადს შორის, რომლებიც ცდილობენ ორი მონიტორის ობიექტის სხვადასხვა წესით დაკავებას:

public class DeadlockExample {
    private final Object lock1 = new Object();
    private final Object lock2 = new Object();

    public void method1() {
        synchronized (lock1) {
            System.out.println("ნაკადი 1 დაიკავა lock1");
            try { Thread.sleep(100); } catch (InterruptedException e) {}
            synchronized (lock2) {
                System.out.println("ნაკადი 1 დაიკავა lock2");
            }
        }
    }

    public void method2() {
        synchronized (lock2) {
            System.out.println("ნაკადი 2 დაიკავა lock2");
            try { Thread.sleep(100); } catch (InterruptedException e) {}
            synchronized (lock1) {
                System.out.println("ნაკადი 2 დაიკავა lock1");
            }
        }
    }

    public static void main(String[] args) {
        DeadlockExample example = new DeadlockExample();

        Thread t1 = new Thread(example::method1);
        Thread t2 = new Thread(example::method2);

        t1.start();
        t2.start();
    }
}

ამ მაგალითში:

  • ნაკადი 1 იღებს lock1, შემდეგ ცდილობს მიიღოს lock2.
  • ნაკადი 2 იღებს lock2, შემდეგ ცდილობს მიიღოს lock1.

თუ ორივე ნაკადი შეძლებს პირველ ბლოკირებას მისაღებად, სანამ მეორე მიიღებს მეორე ბლოკირებას, მაშინ წარმოიქმნება mutual deadlock: თითოეული ნაკადი ელოდება, რომ მეორე გაათავისუფლოს რესურსი, რომელიც ის იკავებს, და პროგრამა გაჩერდება.