Commit 3ad5d19f authored by Trisha Gee's avatar Trisha Gee
Browse files

[Ch15] Solving Ryan and Monica with an AtomicInteger

parent 4e929c49
Loading
Loading
Loading
Loading
+68 −0
Changes for src/main/java/ch15/RyanAndMonicaAtomicTest.java: 68 added lines, 0 removed lines.
Original line number Diff line number Diff line
package ch15;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class RyanAndMonicaAtomicTest {
  public static void main(String[] args) throws InterruptedException {
    long start = System.currentTimeMillis();
    BankAccountWithAtomic account = new BankAccountWithAtomic();
    RyanAndMonicaAtomicJob ryan = new RyanAndMonicaAtomicJob("Ryan", account);
    RyanAndMonicaAtomicJob monica = new RyanAndMonicaAtomicJob("Monica", account);
    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);
  }
}

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

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

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

class BankAccountWithAtomic {
  private final AtomicInteger balance = new AtomicInteger(100);
  public int getBalance() {
    return balance.get();
  }

  public void makeWithdrawal(int amount, String name) {
    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.");

      balance.addAndGet(-amount);

      System.out.println(name + " completes the withdrawal");
    } else {
      System.out.println("Sorry, not enough for " + name);
    }
  }
}

+4 −0
Changes for src/main/java/ch15/RyanAndMonicaSynchronizedTest.java: 4 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ import java.util.concurrent.TimeUnit;

public class RyanAndMonicaSynchronizedTest {
  public static void main(String[] args) throws InterruptedException {
    long start = System.currentTimeMillis();
    BankAccountSynchronized account = new BankAccountSynchronized();
    RyanAndMonicaSynchronizedJob ryan = new RyanAndMonicaSynchronizedJob("Ryan", account);
    RyanAndMonicaSynchronizedJob monica = new RyanAndMonicaSynchronizedJob("Monica", account);
@@ -13,6 +14,9 @@ public class RyanAndMonicaSynchronizedTest {
    executor.execute(ryan);
    executor.execute(monica);
    executor.shutdown();
    executor.awaitTermination(1, TimeUnit.MINUTES);
    long end = System.currentTimeMillis();
    System.out.println(end - start);
  }
}

+6 −1
Changes for src/main/java/ch15/RyanAndMonicaTest.java: 6 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -2,9 +2,11 @@ package ch15;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class RyanAndMonicaTest {
  public static void main(String[] args) {
  public static void main(String[] args) throws InterruptedException {
    long start = System.currentTimeMillis();
    BankAccount account = new BankAccount();
    RyanAndMonicaJob ryan = new RyanAndMonicaJob("Ryan", account);
    RyanAndMonicaJob monica = new RyanAndMonicaJob("Monica", account);
@@ -12,6 +14,9 @@ public class RyanAndMonicaTest {
    executor.execute(ryan);
    executor.execute(monica);
    executor.shutdown();
    executor.awaitTermination(1, TimeUnit.MINUTES);
    long end = System.currentTimeMillis();
    System.out.println(end - start);
  }
}