Loading src/main/java/ch15/RyanAndMonicaAtomicTest.java 0 → 100644 +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); } } } src/main/java/ch15/RyanAndMonicaSynchronizedTest.java +4 −0 Changes for src/main/java/ch15/RyanAndMonicaSynchronizedTest.java: 4 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); } } Loading src/main/java/ch15/RyanAndMonicaTest.java +6 −1 Changes for src/main/java/ch15/RyanAndMonicaTest.java: 6 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); } } Loading Loading
src/main/java/ch15/RyanAndMonicaAtomicTest.java 0 → 100644 +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); } } }
src/main/java/ch15/RyanAndMonicaSynchronizedTest.java +4 −0 Changes for src/main/java/ch15/RyanAndMonicaSynchronizedTest.java: 4 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); } } Loading
src/main/java/ch15/RyanAndMonicaTest.java +6 −1 Changes for src/main/java/ch15/RyanAndMonicaTest.java: 6 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); } } Loading