PDA

View Full Version : اطلاعاتی در مورد DeadLock در thread می خواستم



nedata
چهارشنبه 22 اسفند 1386, 10:33 صبح
سلام
من اطلاعاتی در مورد DeadLock در مبحث threadها در java نیاز دارم. ممنون

handinux
چهارشنبه 22 اسفند 1386, 14:06 عصر
Deadlock موقعیتی را تعریف می کند که دو یا چند Thread برای همیشه در انتظار یکدیگر قفل میشوند و از کار می افتند. به یک مثال توجه نمایید:

Alphonse و Gaston با هم دوستند و بسیار با ادب و مبادی آداب هستند. یک قانون در نزاکت می گوید که وقتی شما به نشانه احترام سر خود را برای دوست خود خم کردید می بایست تا زمانی که دوستتان اجازه دهد سرتان را به حالت خم شده نگاه دارید.متاسفانه این قانون برای مواقعی که هر دوست به صورت همزمان سرشان را به نشانه احترام خم می کنند محاسبه نشده است.(چه قانون مسخره ای!)
مثال زیر این حالت ممکن را شبیه سازی می کند :
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() {
public void run() { alphonse.bow(gaston); }
}).start();
new Thread(new Runnable() {
public void run() { gaston.bow(alphonse); }
}).start();
}
}

حالا Deadlock چگونه اتفاق می افتد؟
وقتی که هر دو دوست سعی می کنند متد bowback (اجازه برای بالا آوردن سر به طرف مقابل) را صدا بزنند و در نتیجه هیچ کدام از بلاک ها خاتمه نمی یابند برای اینکه هر کدام از این دو دوست(هر دو Thread) منتظرند تا دیگری از حالت خم شدن (متد bow) خارج شوند.