Commit 80676bed authored by Trisha Gee's avatar Trisha Gee
Browse files

[Ch15] Making the Atomic version similar to the new improved Monica and Ryan code

parent 1eeeadf2
Loading
Loading
Loading
Loading
+16 −24
Changes for src/main/java/ch15/ryanmonica/RyanAndMonicaAtomicTest.java: 16 added lines, 24 removed lines.
Original line number Diff line number Diff line
@@ -7,59 +7,53 @@ import java.util.concurrent.atomic.AtomicInteger;

public class RyanAndMonicaAtomicTest {
  public static void main(String[] args) throws InterruptedException {
    long start = System.currentTimeMillis();
    for (int i = 0; i < 100; i++) {
      BankAccountWithAtomic account = new BankAccountWithAtomic();
    RyanAndMonicaAtomicJob ryan = new RyanAndMonicaAtomicJob("Ryan", account);
    RyanAndMonicaAtomicJob monica = new RyanAndMonicaAtomicJob("Monica", account);
      RyanAndMonicaAtomicJob ryan = new RyanAndMonicaAtomicJob("Ryan", account, 50);
      RyanAndMonicaAtomicJob monica = new RyanAndMonicaAtomicJob("Monica", account, 100);
      ExecutorService executor = Executors.newFixedThreadPool(2);
      executor.execute(ryan);
      executor.execute(monica);
      executor.shutdown();
      executor.awaitTermination(1, TimeUnit.MINUTES);
    long end = System.currentTimeMillis();
    System.out.println(end - start);
      System.out.println("---");
    }
  }
}

class RyanAndMonicaAtomicJob implements Runnable {
  private final String name;
  private final BankAccountWithAtomic account;
  private final int amountToSpend;

  RyanAndMonicaAtomicJob(String name, BankAccountWithAtomic account) {
  RyanAndMonicaAtomicJob(String name, BankAccountWithAtomic account, int amountToSpend) {
    this.name = name;
    this.account = account;
    this.amountToSpend = amountToSpend;
  }

  public void run() {
    for (int i = 0; i < 15; i++) {
      account.makeWithdrawal(10, name);
      if (account.getBalance() < 0) {
        System.out.println("Overdrawn!");
      }
    goShopping(amountToSpend);
  }

  private void goShopping(int amount) {
    System.out.println(name + " is about to spend");
    account.spend(name, amount);
    System.out.println(name + " finishes spending");
  }
}

class BankAccountWithAtomic {
  private final AtomicInteger balance = new AtomicInteger(100);

  public int getBalance() {
    return balance.get();
  }

  public void makeWithdrawal(int amount, String name) {
  public void spend(String name, int amount) {
    int initialBalance = balance.get();
    if (initialBalance >= amount) {
      System.out.println(name + " is about to withdraw");
      try {
        System.out.println(name + " is going to sleep");
        Thread.sleep(500);
      } catch (InterruptedException ex) {ex.printStackTrace();}
      System.out.println(name + " woke up.");
      boolean success = balance.compareAndSet(initialBalance, initialBalance - amount);
      if (success) {
        System.out.println(name + " completes the withdrawal.");
      } else {
      if (!success) {
        System.out.println("Sorry " + name + ", try again");
      }
    } else {
@@ -67,5 +61,3 @@ class BankAccountWithAtomic {
    }
  }
}