Estoy intentando escribir programa muy simple que imitar DeadLock simple, donde espera enhebrar una de recursos Un bloqueados por el hilo de rosca B y B espera a que el recurso B bloqueado por Tema A.de Java para los principiantes - imitación DeadLock
Aquí está mi código:
//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;
}
}
Ésta es mi ejecutable que realiza la operación en el recurso anterior:
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();
}
}
y finalmente mi clase principal:
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!!!");
}
}
¿Por qué se ejecuta este código se ejecuta con éxito y no tengo y deadLock?
El sueño puede introducir no determinismo. Puedes hacerlo determinista; ver mi respuesta a continuación. – Toby
@Toby: Sí, puedes hacerlo determinista, pero 'dormir' es una buena manera de mostrar cómo se puede * encontrar el punto muerto *, ya que siempre puedes imaginar que un programa sin funciones se ejecuta de manera similar a uno * que * usa duerme, simplemente en virtud de que el hilo no está programado. En otras palabras, un programa que falla cuando se inserta duerme es intrínsecamente defectuoso porque podría verse el mismo "accidentalmente" en la vida real. Lo mismo no es cierto con la inserción de notificaciones. –