Dưới đây là mã trực tiếp từ hướng dẫn của Sun mô tả Deadlock. Tuy nhiên tôi không hiểu làm thế nào Deadlock có thể xảy ra trong tình huống này xem xét cả hai phương pháp được đồng bộ hóa. Hai Thread sẽ nằm trong cùng một phương thức đồng bộ cùng một lúc như thế nào?Câu hỏi về Deadlock từ hướng dẫn Sun
Khóa chết mô tả tình huống có hai hoặc nhiều chuỗi bị chặn vĩnh viễn, chờ đợi nhau. Đây là một ví dụ.
Alphonse và Gaston là bạn bè và những người tin tưởng tuyệt vời trong lịch sự. Một quy tắc lịch sự nghiêm ngặt là khi bạn cúi đầu chào một người bạn, bạn phải cúi chào cho đến khi bạn của bạn có cơ hội trả lại cây cung. Thật không may, quy tắc này không tính đến khả năng hai người bạn có thể cúi đầu với nhau cùng một lúc. Ứng dụng ví dụ này, Deadlock, mô hình khả năng này:
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();
}
}
Khi deadlock chạy, rất có khả năng cả hai luồng sẽ chặn khi chúng cố gọi bowback. Cả hai khối sẽ không bao giờ kết thúc, bởi vì mỗi thread đang chờ người kia thoát khỏi cung.
bản sao có thể có của [Cố gắng quấn bộ não của tôi xung quanh cách bế tắc của chuỗi chủ đề] (http://stackoverflow.com/questions/749641/trying-to-wrap-my-wee-brain-around-how-threads-deadlock) –