我们可以制定锁的顺序,并在整个应用程序中,获得锁都必须始终遵守这个既定的顺序。我们在制定对象顺序的时候,可以使用System.identityHashCode这样一种方式,它会返回Object.hashcode所返回的值。
在极少数的情况下,2个对象具有相同的哈希码,我们必须使用任意的中数来决定锁的顺序,这又重新引入了死锁的可能性。使用另一个锁,在获得2个对象的锁之前,就要获得这个锁
以下程序完成把MONEY从一个帐户转到另一帐户
private static final Object tieLock=new Object();
public void transferMoney(final Account fromAcct,final AccounttoAcct,final DollarAmount amount) throwsInsufficientFundsException{
classHelper{
public void transfer() throws InsufficientFundsException{
if(fromAcct.getBalance().compareTo(amount)<0)
throw new InsufficientFundsException();
else{
fromAcct.debit(amount);
toAcct.credit(amount);
}
}
}
intfromHash=System.identityHashCode(fromAcct);
inttoHash=System.identityHashCode(toAcct);
if(fromHash<toHash){
synchronized (fromAcct){
synchronized (toAcct){
new Helper.transfer();
}
}
}else if(fromHash>toHash){
synchronized (toAcct){
synchronized (fromAcct){
new Helper.transfer();
}
}
}else{
synchronized (tieLock){
synchronized (toAcct){
synchronized (fromAcct){
new Helper.transfer();
}
}
}
}
}