请教有关使用synchronized修饰的方法,出现程序死锁的问题
											当我运行下列程序时,发现出现了死锁的问题?还请论坛的前辈可以帮忙指点~谢谢!服务端程序
 程序代码:
程序代码:import java.util.Arrays;
/**
 * a Bank with a number of bank accounts that uses Synchronization primitives
 * @author john
 *
 */
public class BankSynch {
    private final double[] accounts;
   
    /**
     * Construct the bank
     * @param n the number of accounts
     * @param initialBlance the initial balance for each account
     */
    public BankSynch(int n,double initialBalance) {
        accounts = new double[n];
        Arrays.fill(accounts, initialBalance);
    }
   
    /**
     * Transfer the money from one account to another
     * @param from the account transfer from
     * @param to the account transfer to
     * @param amount the amount to transfer
     * @throws InterruptedException
     */
    public synchronized void transfer(int from, int to, double amount) throws InterruptedException {
        while(accounts[from] < amount) {
            wait();
            System.out.println(Thread.currentThread());
            accounts[from] -= amount;
            System.out.printf("%10.2f from %d to %d",amount,from,to);
            accounts[to] += amount;
            System.out.printf("Total balance: %10.2f%n",getTotalBalance());
            notifyAll();
        }
    }
   
    /**
     * Get the sum of all accounts balance
     * @return the total balance
     */
    private Object getTotalBalance() {
        double sum = 0;
        for(double a : accounts) {
            sum += a;
        }
        return sum;
    }
   
    /**
     * Gets the number of accounts in the bank
     * @return the number of accounts
     */
    public int size() {
        return accounts.length;
    }
}客户端程序 程序代码:
程序代码:/**
 * This program shows data corruption when multiple thread access the dataStructure
 * @author john
 *
 */
public class UnsychBankAccountTest {
    public static final int NACCOUNTS =100;
    public static final double INITIAL_BALANCE =1000;
    public static final double MAX_AMOUNT = 1000;
    public static final int DELAY= 10;
   
    public static void main(String[] args) {
        BankSynch bank = new BankSynch(NACCOUNTS,INITIAL_BALANCE);
        for(int i =0;i<NACCOUNTS;i++) {
            int fromAccount = i;
            Runnable r = () ->{
                try {
                    while(true) {
                        int toAccount = (int)(bank.size()*Math.random());
                        double amount = MAX_AMOUNT * Math.random();
                        bank.transfer(fromAccount, toAccount, amount);
                        Thread.sleep((int)(DELAY*Math.random()));
                    }
                } catch (InterruptedException e) {
               
                }
            };
            Thread t = new Thread(r);
            t.start();
        }
    }
}
 
											





