CAS的全稱為Compare-And-Swap,直譯就是對比交換。是一條CPU的原子指令,其作用是讓CPU先進(jìn)行比較兩個(gè)值是否相等,然后原子地更新某個(gè)位置的值,經(jīng)過調(diào)查發(fā)現(xiàn),其實(shí)現(xiàn)方式是基于硬件平臺的匯編指令,就是說CAS是靠硬件實(shí)現(xiàn)的,JVM只是封裝了匯編調(diào)用,那些AtomicInteger類便是使用了這些封裝后的接口。
簡單解釋:CAS操作需要輸入兩個(gè)數(shù)值,一個(gè)舊值(期望操作前的值)和一個(gè)新值,在操作期間先比較下在舊值有沒有發(fā)生變化,如果沒有發(fā)生變化,才交換成新值,發(fā)生了變化則不交換。
CAS操作是原子性的,所以多線程并發(fā)使用CAS更新數(shù)據(jù)時(shí),可以不使用鎖。JDK中大量使用了CAS來更新數(shù)據(jù)而防止加鎖(synchronized 重量級鎖)來保持原子更新。
相信sql大家都熟悉,類似sql中的條件更新一樣:update set id=3 from table where id=2。因?yàn)閱螚lsql執(zhí)行具有原子性,如果有多個(gè)線程同時(shí)執(zhí)行此sql語句,只有一條能更新成功。