From 61f2e8580fe096fe2d84cd7dae54c7c2e1ef2279 Mon Sep 17 00:00:00 2001 From: mthomas Date: Sat, 28 Mar 2020 04:58:57 -0500 Subject: [PATCH 1/3] BAEL-3860 - Add model class and test for AtomicStampedReference --- .../concurrent/atomic/SafeAccount.java | 34 +++++++++++++++++++ .../atomic/ThreadSafeAccountTest.java | 21 ++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeAccount.java create mode 100644 core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeAccountTest.java diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeAccount.java b/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeAccount.java new file mode 100644 index 0000000000..febfd481c3 --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeAccount.java @@ -0,0 +1,34 @@ +package com.baeldung.concurrent.atomic; + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicStampedReference; + +public class SafeAccount { + + AtomicInteger stamp = new AtomicInteger(0); + AtomicStampedReference balance = new AtomicStampedReference<>(0, 0); + + public int getBalance() { + return this.balance.get(new int[1]); + } + + public int getStamp() { + int[] stamps = new int[1]; + this.balance.get(stamps); + return stamps[0]; + } + + public boolean deposit(int funds) { + int[] stamps = new int[1]; + int current = this.balance.get(stamps); + int newStamp = this.stamp.incrementAndGet(); + return this.balance.compareAndSet(current, current + funds, stamps[0], newStamp); + } + + public boolean withdrawal(int funds) { + int[] stamps = new int[1]; + int current = this.balance.get(stamps); + int newStamp = this.stamp.incrementAndGet(); + return this.balance.compareAndSet(current, current - funds, stamps[0], newStamp); + } +} diff --git a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeAccountTest.java b/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeAccountTest.java new file mode 100644 index 0000000000..b9a5fe7773 --- /dev/null +++ b/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeAccountTest.java @@ -0,0 +1,21 @@ +package com.baeldung.concurrent.atomic; + +import org.junit.Assert; +import org.junit.Test; + +public class ThreadSafeAccountTest { + + @Test + public void givenMultiThread_whenSafeAccountSetBalance() throws InterruptedException { + SafeAccount account = new SafeAccount(); + Thread t = new Thread(() -> { + while (!account.withdrawal(100)) + Thread.yield(); + }); + t.start(); + Assert.assertTrue(account.deposit(100)); + t.join(1_000); + Assert.assertFalse(t.isAlive()); + Assert.assertSame(0, account.getBalance()); + } +} From 92ce5cb8d48c707231e49a8cf3194920c6076ada Mon Sep 17 00:00:00 2001 From: mthomas Date: Tue, 31 Mar 2020 04:43:06 -0500 Subject: [PATCH 2/3] Move code to core-java-modules/core-java-concurrency-advanced-3Add Add missing 'Unit' in test name --- .../com/baeldung/atomicstampedreference}/SafeAccount.java | 6 +++--- .../atomicstampedreference/ThreadSafeAccountUnitTest.java} | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) rename core-java-modules/{core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic => core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference}/SafeAccount.java (82%) rename core-java-modules/{core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeAccountTest.java => core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadSafeAccountUnitTest.java} (70%) diff --git a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeAccount.java b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/SafeAccount.java similarity index 82% rename from core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeAccount.java rename to core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/SafeAccount.java index febfd481c3..fe41429e22 100644 --- a/core-java-modules/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeAccount.java +++ b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/SafeAccount.java @@ -1,12 +1,12 @@ -package com.baeldung.concurrent.atomic; +package com.baeldung.atomicstampedreference; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicStampedReference; public class SafeAccount { - AtomicInteger stamp = new AtomicInteger(0); - AtomicStampedReference balance = new AtomicStampedReference<>(0, 0); + private AtomicInteger stamp = new AtomicInteger(0); + private AtomicStampedReference balance = new AtomicStampedReference<>(0, 0); public int getBalance() { return this.balance.get(new int[1]); diff --git a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeAccountTest.java b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadSafeAccountUnitTest.java similarity index 70% rename from core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeAccountTest.java rename to core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadSafeAccountUnitTest.java index b9a5fe7773..bd33d5b4ec 100644 --- a/core-java-modules/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeAccountTest.java +++ b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadSafeAccountUnitTest.java @@ -1,12 +1,12 @@ -package com.baeldung.concurrent.atomic; +package com.baeldung.atomicstampedreference; import org.junit.Assert; import org.junit.Test; -public class ThreadSafeAccountTest { +public class ThreadSafeAccountUnitTest { @Test - public void givenMultiThread_whenSafeAccountSetBalance() throws InterruptedException { + public void givenMultiThread_whenSafeAccount_thenSetBalance() throws InterruptedException { SafeAccount account = new SafeAccount(); Thread t = new Thread(() -> { while (!account.withdrawal(100)) From c50f5893ed5ef2cfbae3cf23c2d173162b0adecc Mon Sep 17 00:00:00 2001 From: mthomas Date: Tue, 14 Apr 2020 06:44:36 -0500 Subject: [PATCH 3/3] Rename classes --- .../{SafeAccount.java => StampedAccount.java} | 16 ++++++++-------- ...st.java => ThreadStampedAccountUnitTest.java} | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) rename core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/{SafeAccount.java => StampedAccount.java} (63%) rename core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/{ThreadSafeAccountUnitTest.java => ThreadStampedAccountUnitTest.java} (68%) diff --git a/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/SafeAccount.java b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/StampedAccount.java similarity index 63% rename from core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/SafeAccount.java rename to core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/StampedAccount.java index fe41429e22..1a46e1ba52 100644 --- a/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/SafeAccount.java +++ b/core-java-modules/core-java-concurrency-advanced-3/src/main/java/com/baeldung/atomicstampedreference/StampedAccount.java @@ -3,32 +3,32 @@ package com.baeldung.atomicstampedreference; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicStampedReference; -public class SafeAccount { +public class StampedAccount { private AtomicInteger stamp = new AtomicInteger(0); - private AtomicStampedReference balance = new AtomicStampedReference<>(0, 0); + private AtomicStampedReference account = new AtomicStampedReference<>(0, 0); public int getBalance() { - return this.balance.get(new int[1]); + return this.account.get(new int[1]); } public int getStamp() { int[] stamps = new int[1]; - this.balance.get(stamps); + this.account.get(stamps); return stamps[0]; } public boolean deposit(int funds) { int[] stamps = new int[1]; - int current = this.balance.get(stamps); + int current = this.account.get(stamps); int newStamp = this.stamp.incrementAndGet(); - return this.balance.compareAndSet(current, current + funds, stamps[0], newStamp); + return this.account.compareAndSet(current, current + funds, stamps[0], newStamp); } public boolean withdrawal(int funds) { int[] stamps = new int[1]; - int current = this.balance.get(stamps); + int current = this.account.get(stamps); int newStamp = this.stamp.incrementAndGet(); - return this.balance.compareAndSet(current, current - funds, stamps[0], newStamp); + return this.account.compareAndSet(current, current - funds, stamps[0], newStamp); } } diff --git a/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadSafeAccountUnitTest.java b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadStampedAccountUnitTest.java similarity index 68% rename from core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadSafeAccountUnitTest.java rename to core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadStampedAccountUnitTest.java index bd33d5b4ec..ce83355073 100644 --- a/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadSafeAccountUnitTest.java +++ b/core-java-modules/core-java-concurrency-advanced-3/src/test/java/com/baeldung/atomicstampedreference/ThreadStampedAccountUnitTest.java @@ -3,11 +3,11 @@ package com.baeldung.atomicstampedreference; import org.junit.Assert; import org.junit.Test; -public class ThreadSafeAccountUnitTest { +public class ThreadStampedAccountUnitTest { @Test - public void givenMultiThread_whenSafeAccount_thenSetBalance() throws InterruptedException { - SafeAccount account = new SafeAccount(); + public void givenMultiThread_whenStampedAccount_thenSetBalance() throws InterruptedException { + StampedAccount account = new StampedAccount(); Thread t = new Thread(() -> { while (!account.withdrawal(100)) Thread.yield();