BAEL-3860 - Add model class and test for AtomicStampedReference

This commit is contained in:
mthomas 2020-03-28 04:58:57 -05:00
parent 0681590c1c
commit 23153cf01c
2 changed files with 55 additions and 0 deletions

View File

@ -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<Integer> 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);
}
}

View File

@ -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());
}
}