Tôi đang tìm hiểu về sự bế tắc trong Java, và có này mẫu mã từ hướng dẫn chính thức của Sun:Câu hỏi Về Deadlock Tình hình trong Java
Alphonse và Gaston là bạn bè, và tín lớn trong lịch sự. Quy tắc lịch sự nghiêm ngặt là khi bạn cung cấp cho một người bạn, bạn vẫn phải cúi đầu cho đến khi bạn của bạn có cơ hội để trả lại cây cung. Rất tiếc, quy tắc này không tính đến khả năng mà hai người bạn có thể cung cấp cho nhau cùng một lúc.
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();
}
}
Dưới đây là lời giải thích của Sun:
Khi bế tắc chạy, nó là vô cùng khả năng là cả hai chủ đề sẽ chặn khi họ cố gắng để gọi bowBack. Không chặn nào sẽ kết thúc, bởi vì mỗi luồng đang đợi khác để thoát khỏi cung.
Tôi dường như không theo kịp. Khi alphonse.bow (gaston) chạy, phương pháp cung bị khóa. Vì vậy, bây giờ nó sẽ lần đầu tiên in "Gaston đã cúi chào tôi!" Sau đó, nó sẽ tiếp tục và gọi bowback, và khóa bowBack là tốt. Làm thế nào điều này có thể gây ra bế tắc? Tôi có hiểu lầm điều gì sẽ xảy ra khi một phương thức đồng bộ được gọi?
Nếu ai đó có thể cho tôi lời giải thích dễ dàng, cảm ơn.
Hình như có rất nhiều câu trả lời đúng ở đây, nhưng tôi nghĩ rằng nó có thể hữu ích hơn khi định dạng phản hồi thành 2 cột riêng biệt, mỗi cột đại diện cho một chuỗi khác nhau. Điều này thực sự sẽ lái xe về nhà thực tế là 2 bộ hướng dẫn có thể chạy đồng thời. –
bản sao có thể có của [Đang cố gắng bọc bộ não của tôi xung quanh cách bế tắc khóa] (http://stackoverflow.com/questions/749641/trying-to-wrap-my-wee-brain-around-how-threads-deadlock) –
Tôi có sự nhầm lẫn tương tự. Cảm ơn bài đăng và câu trả lời. –