سطح دانش لازم برای درک مقاله: شما دستورات Java Syntax و Java Core را تکمیل کرده اید و اکنون در حال یادگیری Java Multithreading هستید. بن بست یا بن بست در جاوا یا بن بست خطایی است که زمانی رخ می دهد که نخ ها یک وابستگی چرخه ای به یک جفت شی همگام داشته باشند. تصور کنید که یک رشته به مانیتور آبجکت می رود
در این حالت هر دو نخ مسدود می شوند و هر کدام منتظر می مانند تا دیگری قفل را آزاد کند. اما هیچ یک از آنها این کار را انجام نمی دهند، زیرا برای انجام این کار باید روش خود را تکمیل کنند و توسط یک رشته دیگر مسدود می شود. بنابراین آنها در جایی که این اتفاق افتاد گیر کرده بودند
x
و دیگری به مانیتور آبجکت می رود y
. اگر یک رشته در یک شی x
سعی کند هر متد همگامسازی شدهای را روی شی فراخوانی کند y
، و شی y
در همان زمان سعی کند هر متد همگامسازی شدهای را روی شی فراخوانی کند x
، رشتهها در انتظار گیر میکنند. در زیر نمونه ای از آموزش جاوا 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();
}
}
دو نکته مهم در اینجا وجود دارد که باید درک کرد:
- هر یک از موضوعاتی که همزمان در حال اجرا هستند دقیقاً چه کاری انجام می دهند؟
- چه قفل هایی استفاده می شود؟
Friend
: alphonse
and 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
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
دیگر چه بخوانیم: |
---|
گروه توسعه دهندگان جاوا: بهینه سازی های جالب SQL که به مدل هزینه بستگی ندارند. قسمت 1 |
GO TO FULL VERSION