JavaRush /Java Blogu /Random-AZ /Java-da Deadlock nədir?
Alexey Smirnov
Səviyyə
Москва

Java-da Deadlock nədir?

Qrupda dərc edilmişdir
Məqaləni başa düşmək üçün tələb olunan bilik səviyyəsi: siz Java Sintaksis və Java Əsas tapşırıqlarını tamamladınız və indi Java Multithreading-i öyrənmək prosesindəsiniz. Java-da kilidlənmə və ya çıxılmazlıq və ya dalana dirənmə mövzuların bir cüt sinxronlaşdırılmış obyektdən tsiklik asılılığı olduqda baş verən xətadır. Təsəvvür edin ki, bir ip obyekt monitoruna x, digəri isə obyekt monitoruna keçir y. Obyektdəki ip xobyektdə hər hansı sinxronlaşdırılmış metodu çağırmağa çalışırsa yvə obyekt yeyni zamanda obyektdə hər hansı sinxronlaşdırılmış metodu çağırmağa çalışırsa x, iplər gözləmədə ilişib qalacaq. Deadlock nədir?  - 1Aşağıda çıxılmaz vəziyyət kimi bir konsepsiya haqqında java docs dərsliyindən bir nümunə verilmişdir. Burada ip bloklanması harada baş verir?
public class Deadlock {
    static class Friend {
        private final String name;
        public Friend(String name) {
            this.name = name;
        }
        public String getName() {
            return this.name;
        }
        public synchronized void bow(Friend bower) {
            System.out.format("%s: %s" + "  has bowed to me!%n", this.name, bower.getName());
            bower.bowBack(this);
        }
        public synchronized void bowBack(Friend bower) {
            System.out.format("%s: %s"
                + " has bowed back to me!%n",
                this.name, bower.getName());
        }
    }

    public static void main(String[] args) {
        final Friend alphonse =
            new Friend("Alphonse");
        final Friend gaston =
            new Friend("Gaston");
        new Thread(new Runnable() {
            @Override
            public void run() {
               // System.out.println("Thread 1");
                alphonse.bow(gaston);
               // System.out.println("Th: gaston bowed to alphonse");
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
              //  System.out.println("Thread 2");
                gaston.bow(alphonse);
              //  System.out.println("2.gaston waiting alph bowed");
            }
        }).start();
    }
}
Burada başa düşmək üçün iki vacib şey var:
  1. Eyni zamanda işləyən iplərin hər biri tam olaraq nə edir?
  2. Hansı kilidlərdən istifadə olunur?
Sondan başlayaq. Tutaq ki, siz sinfin iki obyektini yaratdınız Friend: alphonsegaston. Onların hər birinin öz kilidi var. Beləliklə, bu qıfıllardan ikisi var: giqolos və qastonlar. Obyektin sinxronlaşdırılmış metodu daxil edildikdə onun kilidi kilidlənir, metoddan çıxdıqda isə buraxılır (və ya kilidi açılır). İndi iplər haqqında. Gəlin birinci ipi çağıraq Alphonse(onu alfons obyektindən ayırmaq üçün böyük hərflə). Budur, nə edir (gəlin onu adlandıraq A, qısaca olaraq Alphonse):
A: alphonse.bow(gaston) — получает лок alphonse;
A: gaston.bowBack(alphonse) — получает лок gaston;
A: возвращается из обоих методов, тем самым освобождая лок.
Və ipin bu anda etdiyi şey budur Gaston:
G: gaston.bow(alphonse) — получает лок gaston;
G: alphonse.bowBack(gaston) — получает лок alphonse;
G: возвращается из обоих методов, тем самым освобождая лок.
İndi gəlin bu məlumatları bir yerə yığaq və cavabı alaq. Mövzular müxtəlif sıralarda bir-birinə bağlana bilər (yəni onların hadisələri baş verəcək). Sifariş aşağıdakı kimi olarsa, məsələn, çıxılmaz vəziyyət işləyəcək:
A: alphonse.bow(gaston) — получает лок alphonse
G: gaston.bow(alphonse) — получает лок gaston
G: пытается вызвать alphonse.bowBack(gaston), но блокируется, ожидая лока alphonse
A: пытается вызвать gaston.bowBack(alphonse), но блокируется, ожидая лока gaston
Deadlock nədir?  - 2
Bu halda, hər iki ip bloklanır və hər biri digərinin kilidi buraxmasını gözləyir. Lakin onların heç biri bunu etməyəcək, çünki bunu etmək üçün onlar öz metodlarını tamamlamalıdırlar və o, başqa mövzu ilə bloklanır. Buna görə də hadisə baş verdiyi yerdə ilişib qaldılar deadlock. Bununla birlikdə, başqa bir toxunuş da mümkündür, burada iplərdən birinin ikincisi başlamazdan əvvəl tamamlamaq üçün vaxtı olacaq:
A: alphonse.bow(gaston) — получает лок alphonse
A: gaston.bowBack(alphonse) — получает лок gaston
A: возвращается из обоих методов, открывая оба лока
G: gaston.bow(alphonse) — получает лок gaston
G: alphonse.bowBack(gaston) — получает лок alphonse
G: возвращается из обоих методов, открывая оба лока
Bu vəziyyətdə iplərin qarşılıqlı bloklanması yoxdur. Məsələn, başqa bir mövzunun icrası üçün vaxt tapmağa imkan verən bəzi üsul əlavə edildi. Nəticə eyni vaxtda baş verən hadisələrin ardıcıllığından (planlaşdırılmış qaydada və ya icra sürətindən) asılı olduqda, belə proses rus dilində yarış şərti adlanır - "yarış şərti". Bütün yarış şərtləri potensial olaraq dalana səbəb olmur, lakin mənim təcrübəmə görə, yalnız yarış şərtləri dalana səbəb olur. Göndərən: Dave Lillethun
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION