почему этот синхронизированный метод не работает должным образом?

У меня есть класс под названием «Учетная запись»

public class Account {

    public double balance = 1500;

    public synchronized double withDrawFromPrivateBalance(double a) {
        balance -= a;
        return balance;
    }
}

и класс под названием ATMThread

public class ATMThread extends Thread {
    double localBalance = 0;
    Account myTargetAccount;

    public ATMThread(Account a) {
        this.myTargetAccount = a;
    }

    public void run() {
        find();
    }

    private synchronized void find() {
        localBalance = myTargetAccount.balance;
        System.out.println(getName() + ": local balance = " + localBalance);
        localBalance -= 100;
        myTargetAccount.balance =  localBalance;
    }

    public static void main(String[] args) {
        Account account = new Account();
        System.out.println("START: Account balance = " + account.balance);

        ATMThread a = new ATMThread(account);
        ATMThread b = new ATMThread(account);

        a.start();
        b.start();

        try {
            a.join();
            b.join();
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }

        System.out.println("END: Account balance = " + account.balance);
    }

}

Я создаю два потока, мы предполагаем, что на банковском счете есть начальный баланс (1500 $)

первый поток пытается снять 100$ и второй поток тоже.

Я ожидаю, что окончательный баланс будет 1300, однако иногда это 1400. Может кто-нибудь объяснить мне, почему? Я использую синхронизированные методы...

6
задан Turing85 5 November 2017 в 15:12
поделиться