JavaRush /وبلاگ جاوا /Random-FA /Deadlock در جاوا چیست؟
Alexey Smirnov
مرحله
Москва

Deadlock در جاوا چیست؟

در گروه منتشر شد
سطح دانش لازم برای درک مقاله: شما دستورات Java Syntax و Java Core را تکمیل کرده اید و اکنون در حال یادگیری Java Multithreading هستید. بن بست یا بن بست در جاوا یا بن بست خطایی است که زمانی رخ می دهد که نخ ها یک وابستگی چرخه ای به یک جفت شی همگام داشته باشند. تصور کنید که یک رشته به مانیتور آبجکت می رود xو دیگری به مانیتور آبجکت می رود y. اگر یک رشته در یک شی xسعی کند هر متد همگام‌سازی شده‌ای را روی شی فراخوانی کند y، و شی yدر همان زمان سعی کند هر متد همگام‌سازی شده‌ای را روی شی فراخوانی کند x، رشته‌ها در انتظار گیر می‌کنند. بن بست چیست؟  - 1در زیر نمونه ای از آموزش جاوا docs در مورد مفهوم بن بست آورده شده است. مسدود کردن موضوع در کجا رخ می دهد؟
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();
    }
}
دو نکته مهم در اینجا وجود دارد که باید درک کرد:
  1. هر یک از موضوعاتی که همزمان در حال اجرا هستند دقیقاً چه کاری انجام می دهند؟
  2. چه قفل هایی استفاده می شود؟
بیایید از آخر شروع کنیم. فرض کنید دو شی از کلاس ایجاد کردید Friend: alphonseand gaston. هر کدام قفل مخصوص به خود را دارند. بنابراین، دو مورد از این قفل ها وجود دارد: ژیگولو و گاستون. هنگامی که یک متد هماهنگ شده از یک شی وارد می شود، قفل آن قفل می شود و زمانی که روش خارج می شود، آزاد می شود (یا قفل آن باز می شود). حالا در مورد تاپیک ها. بیایید اولین رشته را Alphonse(با حرف بزرگ برای تشخیص آن از شیء آلفونس) صدا کنیم. این چیزی است که آن را انجام می دهد (بیایید آن را Aبه اختصار بخوانیم Alphonse):
A: alphonse.bow(gaston) — получает лок alphonse;
A: gaston.bowBack(alphonse) — получает лок gaston;
A: возвращается из обоих методов, тем самым освобождая лок.
و این چیزی است که تاپیک در این زمان انجام می دهد Gaston:
G: gaston.bow(alphonse) — получает лок gaston;
G: alphonse.bowBack(gaston) — получает лок alphonse;
G: возвращается из обоих методов, тем самым освобождая лок.
حالا بیایید این داده ها را کنار هم بگذاریم و پاسخ را دریافت کنیم. موضوعات را می توان به ترتیب مختلف در هم تنید (یعنی رویدادهای آنها رخ می دهد). بن بست کار خواهد کرد، برای مثال، اگر ترتیب به شرح زیر باشد:
A: alphonse.bow(gaston) — получает лок alphonse
G: gaston.bow(alphonse) — получает лок gaston
G: пытается вызвать alphonse.bowBack(gaston), но блокируется, ожидая лока alphonse
A: пытается вызвать gaston.bowBack(alphonse), но блокируется, ожидая лока gaston
بن بست چیست؟  - 2
در این حالت هر دو نخ مسدود می شوند و هر کدام منتظر می مانند تا دیگری قفل را آزاد کند. اما هیچ یک از آنها این کار را انجام نمی دهند، زیرا برای انجام این کار باید روش خود را تکمیل کنند و توسط یک رشته دیگر مسدود می شود. بنابراین آنها در جایی که این اتفاق افتاد گیر کرده بودند deadlock. با این حال، بافت دیگری نیز امکان پذیر است، که در آن یکی از نخ ها قبل از شروع دوم، زمان کامل شدن را خواهد داشت:
A: alphonse.bow(gaston) — получает лок alphonse
A: gaston.bowBack(alphonse) — получает лок gaston
A: возвращается из обоих методов, открывая оба лока
G: gaston.bow(alphonse) — получает лок gaston
G: alphonse.bowBack(gaston) — получает лок alphonse
G: возвращается из обоих методов, открывая оба лока
در این حالت، هیچ انسداد متقابلی از موضوعات وجود ندارد. به عنوان مثال، روشی اضافه شده است که به یک رشته دیگر اجازه می دهد تا زمان اجرا داشته باشد. هنگامی که نتیجه به ترتیب رویدادهای همزمان (ترتیب برنامه ریزی شده یا سرعت اجرا) بستگی دارد، چنین فرآیندی در روسی شرایط مسابقه نامیده می شود - "شرایط مسابقه". همه شرایط مسابقه به طور بالقوه باعث بن بست نمی شوند، با این حال، در تجربه من، تنها شرایط مسابقه باعث بن بست می شود. پاسخ داده شده توسط: Dave Lillethun
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION