package cas;
public class TwoThreadCompetiton implements Runnable{
private volatile int value;
public synchronized int compareAndSwap(int expectedValue,int newValue){
int oldValue = value;
if (oldValue == expectedValue){
value = newValue;
}
return oldValue;
}
public static void main(String[] args) throws InterruptedException {
TwoThreadCompetiton r = new TwoThreadCompetiton();
r.value=0;
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(r.value);
}
@Override
public void run() {
compareAndSwap(0,1);
}
}
AtomicInteger加载Unsafe工具 ,用来操作内存数据
用Unsafe实现底层操作
用volatile修饰value字段 ,保证可见性
1。dowhile将compareAndSwapInt进行自旋
2。Unsafe是硬件级别的原子操作,获取变量值在内存中的偏移地址
CAS缺点
ABA问题:5改到7,7又改回5,CAS以为没变,其实修改了,可以添加版本号。
自旋时间过长