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: თითოეული ნაკადი ელოდება, რომ მეორე გაათავისუფლოს რესურსი, რომელიც ის იკავებს, და პროგრამა გაჩერდება.