package test;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicStampedReference;
public class ABAProblemTest {
private static int initInterger = 10000;
private static int initIntergePlusOne = 10001;
private static AtomicInteger atomicInt = new AtomicInteger(initInterger);
private static AtomicStampedReference atomicStampedRef = new AtomicStampedReference(initInterger, 0);
public static void main(String[] args) throws InterruptedException {
Thread intT1 = new Thread(new Runnable() {
public void run() {
atomicInt.compareAndSet(initInterger, initIntergePlusOne);
atomicInt.compareAndSet(initIntergePlusOne, initInterger);
}
});
Thread intT2 = new Thread(new Runnable() {
public void run() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
}
boolean c3 = atomicInt.compareAndSet(initInterger, initIntergePlusOne);
System.out.println(c3); // true
}
});
intT1.start();
intT2.start();
intT1.join();
intT2.join();
Thread refT1 = new Thread(new Runnable() {
public void run() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
}
atomicStampedRef.compareAndSet(initInterger, initIntergePlusOne, atomicStampedRef.getStamp(), atomicStampedRef.getStamp() + 1);
atomicStampedRef.compareAndSet(initIntergePlusOne, initInterger, atomicStampedRef.getStamp(), atomicStampedRef.getStamp() + 1);
}
});
Thread refT2 = new Thread(new Runnable() {
public void run() {
int stamp = atomicStampedRef.getStamp();
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
}
boolean c3 = atomicStampedRef.compareAndSet(initInterger, initIntergePlusOne, stamp, stamp + 1);
System.out.println(c3); // false
}
});
refT1.start();
refT2.start();
}
}
ABA问题
最新推荐文章于 2023-11-16 09:27:22 发布