欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

JAVA面試中常常問到的無鎖CAS是什么

夏志豪2年前21瀏覽0評論

JAVA面試中常常問到的無鎖CAS是什么?

在緩存領(lǐng)域有一對奇葩,多線程的緩存和單線程的redis,而兩者的性能是差不多的,之所以redis能憑借單線程提供強(qiáng)大的性能并且線程安全操作:

一是不存在多線程直接切換的資源開銷,

二是大部分的指令都是原子的,原子的指令擁有更高的效率,并且保證線程安全!

在java中的原子操作主要封裝在并發(fā)包下,以Atomic打頭的類中,如下截圖:

觀察這些類發(fā)現(xiàn),其中的原子操作主要依賴于UnSafe包中類似unsafe.compareAndSwapInt這樣的算法,取單詞首字母,也即是CAS操作,這也是實現(xiàn)無鎖操作保證線程安全的基石,樂觀鎖因為建立在CPU的底層指令原子操作,效率比起同步鎖相當(dāng)高;

CAS:compare,and,swap:顧名思義,就是比較并交換,這屬于一種樂觀鎖思想,悲觀鎖通常是把共享資源的持有者當(dāng)做互斥的,由此保證針對共享資源操作的只會是持有鎖的程序!

而樂觀鎖之所以稱為樂觀,就是假設(shè)數(shù)據(jù)在操作之前都是沒有被修改過的,如果已經(jīng)被修改過,則不進(jìn)行操作,降低了阻塞的可能性!

CAS的思想在sql操作中常常用到,比如未付款status=1,已付款status=2,sql:update set status=2,version=version+1 where id = xx and status =1 and version=${version},即是如果是還未付款的狀態(tài)則付款,如果已經(jīng)付過款(status=2),則操作失敗;

但是CAS也存在問題:

①,ABA問題,比如上面的sql,如果status是會從1(A)到2(B)再到1(A)的,那么就會存在線程一已經(jīng)從1->2->1了,而線程二還認(rèn)為整個數(shù)據(jù)都沒有變過,繼續(xù)修改數(shù)據(jù);

②,性能浪費:CAS的操作依賴于自旋(不斷循環(huán)到滿足條件),如果條件一直不滿足,則CPU開銷一直存在;

下面以AtomicInteger 為例說下CAS的應(yīng)用類特性:

1,從構(gòu)造器和get,set方法來看,處理的值需要修飾為內(nèi)存可見的valatile。

2,大多數(shù)的方法都是使用了unsafe中的compareAndSwap方法,都是native方法,說明是底層封裝;

直接看案例,如下截圖:

案例中的AtomicInteger,如果改成Integer,結(jié)果基本都會小于100,說明數(shù)據(jù)計算錯誤了!

CAS作為AQS模型的基石,兩者都是面試過程中常常問到的,下次再講AQS,喜歡的童鞋歡迎點贊關(guān)注。。

java  鎖,JAVA面試中常常問到的無鎖CAS是什么