Commit 7518478d authored by Trisha Gee's avatar Trisha Gee
Browse files

[Ch15] Synchronised version of the updated Ryan and Monica problem

parent 5888bda1
Loading
Loading
Loading
Loading
+17 −25
Changes for src/main/java/ch15/ryanmonica/RyanAndMonicaSynchronizedTest.java: 17 added lines, 25 removed lines.
Original line number Diff line number Diff line
@@ -2,11 +2,9 @@ package ch15.ryanmonica;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
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);
@@ -14,9 +12,6 @@ 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);
  }
}

@@ -30,38 +25,35 @@ class RyanAndMonicaSynchronizedJob implements Runnable {
  }

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

  private void goShopping(int amount) {
    synchronized (account) {
      if (account.getBalance() >= amount) {
        System.out.println(name + " is about to spend");
        account.spend(amount);
        System.out.println(name + " finishes spending");
      } else {
        System.out.println("Sorry, not enough for " + name);
      }
    }
  }
}

class BankAccountSynchronized {
  private int balance = 100;
  private int balance = 50;

  public int getBalance() {
    return balance;
  }

  private void withdraw(int amount) {
  public void spend(int amount) {
    balance = balance - amount;
  }

  public synchronized void makeWithdrawal(int amount, String name) {
    if (balance >= 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.");
      withdraw(amount);
      System.out.println(name + " completes the withdrawal");
    } else {
      System.out.println("Sorry, not enough for " + name);
    if (balance < 0) {
      System.out.println("Overdrawn!");
    }
  }
}
+6 −6

File changed.

Contains only whitespace changes.