get incorrect data from object (java)

Viewed 34

I have a object account share for other 2 object. When I try to get data from account.balance I get incorrect data. Why?

import java.util.concurrent.*;

public class RyanAndMonicaTest {
    public static void main(String[] args) {
        BankAccount account = new BankAccount();
        RyanAndMonicaJob ryan = new RyanAndMonicaJob("Ryan", account, 50);
        RyanAndMonicaJob monica = new RyanAndMonicaJob("Monica", account, 30);
        RyanAndMonicaJob richard = new RyanAndMonicaJob("Richard", account, 100);
        
        ExecutorService executor = Executors.newFixedThreadPool(2);
        executor.execute(ryan);
                System.out.println(account.balance);
        executor.execute(monica);
        executor.execute(richard);
        executor.shutdown();
        System.out.println(account.balance);
        System.out.println(ryan.accounts.getBalance());
        
    }
}
    
class RyanAndMonicaJob implements Runnable {
    private final String name;
    public final BankAccount accounts;
    private final int amountToSpend;
    
    public RyanAndMonicaJob(String name, BankAccount accounts, int amountToSpend) {
        this.accounts = accounts;
        this.name = name;
        this.amountToSpend = amountToSpend;
    }
    
    public void run() {
        goShopping(amountToSpend);
    }
    
    private void goShopping(int amount) {
        System.out.println(name + " is about to spend");
        accounts.spend(name, amount);
        System.out.println(name + " finishes spending");
    }
}

class BankAccount {
    public int balance = 100;
    
    public int getBalance() {
        return balance;
    }
    
    public synchronized void spend(String name, int amount) {
        if (balance >= amount) {
            balance = balance - amount;
            if (balance < 0) {
                System.out.println("Overdrawn");
            } 
        } else {
            System.out.println("Sorry, not enough for " + name);
        }
    }
}

Changed the modifier variable balance in BankAccount class. In class RyanAndMonicaJob got correct data but in main didn't get correct data I expected get balance = 20;

0 Answers
Related