這篇文章主要講解了“JAVA中哪些地方用到CAS”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“JAVA中哪些地方用到CAS”吧!
成都創(chuàng)新互聯(lián)公司專注于石屏企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城開發(fā)。石屏網(wǎng)站建設(shè)公司,為石屏等地區(qū)提供建站服務(wù)。全流程按需規(guī)劃網(wǎng)站,專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
CAS 全稱compareAndSet,比較并交換的意思,CAS為無鎖操作(其實就是CPU級別的鎖,跟操作系統(tǒng)沒關(guān)系,而且CPU級別的鎖比較快)。
顧名思義CAS操作分為兩步,先比較后交換。既然要進(jìn)行比較然后在進(jìn)行交換,那肯定是涉及到了三個參數(shù),自己V、和誰進(jìn)行比較 E、比較完之后需要修改成誰 U。
V即為需要進(jìn)行比較的參數(shù),E為變量在內(nèi)存中的最新值,U為需要修改的值。CAS在接收到三個參數(shù)后,先對V和E進(jìn)行比較,如果V=E證明變量V沒有被其他線程修改過,CAS就會把V替換成U;如V != E 證明這個變量已經(jīng)被其他線程修改了,所以CVS認(rèn)為本次操作是一次無效操作,不會進(jìn)行任何操作。
//JDK版本為 jdk1.8.0_161 public static void main(String[] args) { // 1 AtomicInteger atomicInteger = new AtomicInteger(10); // 2 boolean flag = atomicInteger.compareAndSet(10, 11); System.out.println(flag); // true // 3 flag = atomicInteger.compareAndSet(10, 11); System.out.println(flag);// false }
上面代碼中,第一步是定義了一個原子性的整數(shù)類型atomicInteger,它的值為10;第二步對這個value進(jìn)行CAS操作,因為AtomicInteger對CAS進(jìn)行了封裝,V永遠(yuǎn)是AtomicInteger內(nèi)部的value,所以第二步的CAS少了V這個參數(shù),CAS拿到atomicInteger變量的value和傳進(jìn)去的第一個參數(shù)進(jìn)行比較,通過比較發(fā)現(xiàn)value = 10 這個條件是成立的,于是就把第二個參數(shù)11替換成了原來的10(整個第二步是原子性操作),并且返回一個boolean類型的操作成功true;第三步CAS又拿著自己的value 11(因為在第二步已經(jīng)替換成為11了)和第一個參數(shù) 10 進(jìn)行比較,通過比較發(fā)現(xiàn)11 != 10 條件不成立,于是不進(jìn)行任何操作,并且返回一個boolean類型的操作失敗 false。
目前CAS在jdk中主要應(yīng)用在J.U.C相關(guān)包下的Atomic相關(guān)類中,主要有AtomicInteger、AtomicLong、AtomicBoolean、AtomicDouble、AtomicReference、AtomicReferenceFieldUpdater等。
以AtomicInteger類下的getAndUpdate為例 :
/** * Atomically updates the current value with the results of * applying the given function, returning the previous value. The * function should be side-effect-free, since it may be re-applied * when attempted updates fail due to contention among threads. * * @param updateFunction a side-effect-free function * @return the previous value * @since 1.8 */ public final int getAndUpdate(IntUnaryOperator updateFunction) { int prev, next; do { prev = get(); next = updateFunction.applyAsInt(prev); } while (!compareAndSet(prev, next)); return prev; } /** * Gets the current value. * * @return the current value */ public final int get() { return value; }
第一步:首先通過get()方法獲取到當(dāng)前對象的value。
第二步:updateFunction為函數(shù)引用,不過他的操作也是為了賦值,并返回預(yù)期結(jié)果。
第三步:進(jìn)行CAS操作,傳入第一步get()獲取到的值和目前對象中的值進(jìn)行比較,如果一樣就修改為next,不一樣就繼續(xù)循環(huán),直到CAS操作返回true為止。
第四步:返回當(dāng)前獲取到的值prev。
感謝各位的閱讀,以上就是“JAVA中哪些地方用到CAS”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對JAVA中哪些地方用到CAS這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
分享文章:JAVA中哪些地方用到CAS
文章位置:http://aaarwkj.com/article44/pccche.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計公司、面包屑導(dǎo)航、外貿(mào)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)