java, جاوا, همزمانی در جاوا (MultiThreading)

بن بست در جاوا (DeadLock in Java)

بن بست در جاوا

در این جلسه تیم کدگیت را با آموزش بن بست در جاوا (Dead Lock) همراهی کنید. پیش نیاز های این آموزش شامل موارد زیر است:

  1. آشنایی با thread
  2. آشنایی با inner class
  3. آشنایی با synchronized
  4. آشنایی با استثناها
  5. آشنایی با final

بن بست (DeadLock)

بن‌بست (به انگلیسی: Deadlock) در علوم رایانه، در محیط‌های چندبرنامگی، بن‌بست به حالتی گفته می‌شود دو یا چند کار پردازشی منتظر پایان کار یکدیگر هستند در حالی کارشان به پایان نرسد. در این حالت، پردازش‌های مختلف در حالی که منتظر گرفتن منبع هستند، منابع مورد نیاز آن‌ها توسط سایر پردازش‌های منتظر نگه‌داشته شده‌است و توانایی اختصاص منابع به هیچ یک از پردازش‌ها وجود نداشته باشد. در یک بن‌بست، پردازش‌ها به پایان نمی‌رسند و منابع سیستم گره می‌خورند که حتی سایر پردازش‌ها را برای شروع کار منع می‌شوند (ویکیپدیا).

بن بست در جاوا

برای پیاده سازی بن بست در جاوا ما از دو thread استفاده میکنیم. این دو thread در خودشان از بلاک synchronized استفاده کرده اند. کد بن بست در جاوا به صورت زیر است:

public class TestDeadLock {

     public static void main(String[] args) {
          final String resource1 = "CodeGate";
          final String resource2 = "CodeGate Team";

          Thread t1 = new Thread() {
              public void run() {
                   synchronized (resource1) {
                        System.out.println("Thread 1: locked resource 1");

                        try {
                             Thread.sleep(100);
                        } catch (Exception e) {
                        }

                        synchronized (resource2) {
                             System.out.println("Thread 1: locked resource 2");
                        }
                   }
              }
          };

          // t2 tries to lock resource2 then resource1
          Thread t2 = new Thread() {
              public void run() {
                   synchronized (resource2) {
                        System.out.println("Thread 2: locked resource 2");

                        try {
                             Thread.sleep(100);
                        } catch (Exception e) {
                        }

                        synchronized (resource1) {
                             System.out.println("Thread 2: locked resource 1");
                        }
                   }
              }
          };

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

}

همانطور که میبینید ما دو متغیر به نام resource1 و resource2 ساختیم و در بلاک synchronized قرار دادیم. هر thread به ازای دو متغیر گفته شده یک بلاک synchronized دارد که مجموعا میشود دو بلاک برای هر thread. برنامه بالا هیچوقت تمام نمیشود!! زیرا هر دو thread با هم شروع میشوند و فرض کنید thread اول و دوم وارد بلاک اول شود حال هر دو متغیر گفته شده lock شدند و در عین حال طبق کد ما در بلاک دوم هر کدام از threadها منتظر یکدیگرند!!!!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *