Tôi đang cố gắng viết chương trình rất đơn giản sẽ bắt chước DeadLock đơn giản, trong đó Thread A đợi Resource A bị khóa bởi Thread B và Thread B đợi Resource B bị khóa bởi Thread A.Java cho người mới - DeadLock giả
Đây là mã của tôi:
//it will be my Shared resource
public class Account {
private float amount;
public void debit(double amount){
this.amount-=amount;
}
public void credit(double amount){
this.amount+=amount;
}
}
Đây là Runnable của tôi mà thực hiện hoạt động trên tài nguyên trên:
public class BankTransaction implements Runnable {
Account fromAccount,toAccount;
float ammount;
public BankTransaction(Account fromAccount, Account toAccount,float ammount){
this.fromAccount = fromAccount;
this.toAccount = toAccount;
this.ammount = ammount;
}
private void transferMoney(){
synchronized(fromAccount){
synchronized(toAccount){
fromAccount.debit(ammount);
toAccount.credit(ammount);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Current Transaction Completed!!!");
}
}
}
@Override
public void run() {
transferMoney();
}
}
và cuối cùng là lớp học chính của tôi:
public static void main(String[] args) {
Account a = new Account();
Account b = new Account();
Thread thread1 = new Thread(new BankTransaction(a,b,500));
Thread thread2 = new Thread(new BankTransaction(b,a,500));
thread1.start();
thread2.start();
System.out.println("Transactions Completed!!!");
}
}
Tại sao mã này chạy thực thi thành công và tôi không có và deadLock?
Giấc ngủ có thể giới thiệu tính không xác định. Bạn có thể làm cho nó xác định; xem câu trả lời của tôi dưới đây. – Toby
@Toby: Có, bạn có thể làm cho nó xác định - nhưng 'ngủ' là cách tốt để hiển thị bế tắc * có thể xảy ra như thế nào, vì bạn luôn có thể tưởng tượng một chương trình không ngủ tương tự như chương trình * sử dụng chế độ ngủ, chỉ đơn giản là nhờ vào luồng không được lên lịch. Nói cách khác, một chương trình thất bại khi bạn chèn vào giấc ngủ vốn đã thiếu sót vì bạn có thể thấy cùng "vô tình" trong cuộc sống thực. Điều này cũng không đúng với việc chèn thông báo. –