什么是CAS?
CAS 就是 比較 交換
compare and swap
講一講 aotomaticInteger
在多線程的i++ 操作 使用aotomaticInteger
public class CASDemo {
public static void main(String[] args){
AtomicInteger integer = new AtomicInteger(5);
//expected value, new value
System.out.println(integer.compareAndSet(6, 2019)+""+integer.get());
}
}

每個工作線程寫入之前都會判斷和expected value是否相等
CAS底層原理 自旋鎖
getAndIncrement調(diào)用了
Unsafe類下getAndAddInt

Unsafe: CAS的核心類,由于JAVA 無法訪問底層系統(tǒng),需要通過本地native方法訪問,unsafe 相當(dāng)于一個后門,基于該類可以操作特定數(shù)據(jù),unsafe存在于sun.misc包,其內(nèi)部方法可以像調(diào)用C指針一樣操作內(nèi)存

Unsafe類可以根據(jù)內(nèi)存偏移地址獲取對象
JVM會幫助我們實現(xiàn)CAS 匯編指令,這是一種依賴硬件的功能。
通過它實現(xiàn)了原子操作

var5:根據(jù)object var1 和 var2偏移量 獲得對象的值
然后判斷當(dāng)前位置的數(shù)值是不是var5,是的話就+1然后結(jié)束循環(huán)
不是的話就重復(fù)
=========================
CAS 底層用的是do和while 既保證一致性,又保證并發(fā)性
============================
CAS有什么缺點?
CAS 需要多次比較
循環(huán)時間長 開銷大 可能會給CPU 帶來很大開銷
只能保證一個共享變量的原子操作
========================================
ABA問題
線程 1 在第10 S 把 A改成B
線程 2 在第3 S A改成 C 又在第8S把 C改成A
===============================、
解決方法: 使用帶時間戳的原子引用 AutomicRefecrence

新增修改版本號
===AutomicStampedReference