Ich frage mich, was die alternativen Möglichkeiten sind, Deadlock in dem folgenden Beispiel zu vermeiden. Das folgende Beispiel zeigt ein typisches Bankkonto, bei dem ein Deadlock-Problem auftritt. Was sind einige bessere Ansätze, um es in der Praxis zu lösen?Vermeiden Sie Deadlock-Beispiel
class Account {
double balance;
int id;
public Account(int id, double balance){
this.balance = balance;
this.id = id;
}
void withdraw(double amount){
balance -= amount;
}
void deposit(double amount){
balance += amount;
}
}
class Main{
public static void main(String [] args){
final Account a = new Account(1,1000);
final Account b = new Account(2,300);
Thread a = new Thread(){
public void run(){
transfer(a,b,200);
}
};
Thread b = new Thread(){
public void run(){
transfer(b,a,300);
}
};
a.start();
b.start();
}
public static void transfer(Account from, Account to, double amount){
synchronized(from){
synchronized(to){
from.withdraw(amount);
to.deposit(amount);
}
}
}
}
Ich frage mich, wird es aus der Sackgasse Problem lösen, wenn ich in meiner Übertragungsmethode die verschachtelte Aussperrung trennen wie die folgenden
synchronized(from){
from.withdraw(amount);
}
synchronized(to){
to.deposit(amount);
}
Ihr Beispiel ist kein klassisches Deadlock-Beispiel. Es sperrt immer das Konto für denselben Thread, so dass kein Deadlock auftritt. Haben Sie diesen Code in Ihrer Übertragungsmethode versucht: statischer Leertransfer (BankAccount von, BankAccount zu, doppelte Menge) { synchronisiert (von) { \t from.withdraw (Menge); synchronisiert (zu) { todeposit (Menge); } } } – supernova