package CAS;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author admin
* @version 1.0.0
* @ClassName demo1.java
* @Description TODO
* @createTime 2021年06月02日 18:35:00
*/
public class demo1 {
public static void main(String[] args) {
// CAS compareAndSet比较并交换
AtomicInteger atomicInteger = new AtomicInteger(2020);
/**
* 期望 更新
* public final boolean compareAndSet(int expect, int update)
* 如果期望的值达到了,就更新,否则,就不更新; CAS是CPU的并发原语
*/
//======================捣乱的线程=========================
System.out.println(atomicInteger.compareAndSet(2020, 2021));
System.out.println(atomicInteger);
System.out.println(atomicInteger.compareAndSet(2021, 2020));
System.out.println(atomicInteger);
// ===================期望的线程=====================
System.out.println(atomicInteger.compareAndSet(2020, 2021));
System.out.println(atomicInteger);
}
}
解决ABA问题,对应乐观锁
package CAS;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicStampedReference;
/**
* @author admin
* @version 1.0.0
* @ClassName demo1.java
* @Description TODO
* @createTime 2021年06月02日 18:35:00
*/
public class demo1 {
public static void main(String[] args) {
// CAS compareAndSet比较并交换
// AtomicInteger atomicInteger = new AtomicInteger(2020);
AtomicStampedReference<Integer> atomicInteger = new AtomicStampedReference(100,1);
/**
* 期望 更新
* public final boolean compareAndSet(int expect, int update)
* 如果期望的值达到了,就更新,否则,就不更新; CAS是CPU的并发原语
*/
new Thread(()->{
int time = atomicInteger.getStamp(); // 获得版本号
System.out.println("A-----> "+time);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(atomicInteger.compareAndSet(100, 101, atomicInteger.getStamp(), atomicInteger.getStamp() + 1));
System.out.println("A "+atomicInteger.getStamp());
System.out.println(atomicInteger.compareAndSet(101, 100, atomicInteger.getStamp(), atomicInteger.getStamp() + 1));
System.out.println("A "+atomicInteger.getStamp());
},"A").start();
new Thread(()->{
int time = atomicInteger.getStamp(); // 获得版本号
System.out.println("B-----> "+time);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(atomicInteger.compareAndSet(100, 101, time, time + 1));
System.out.println("B "+atomicInteger.getStamp());
},"B").start();
}
}