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;