JAVA中哪些地方用到CAS

這篇文章主要講解了“JAVA中哪些地方用到CAS”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(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è)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

什么是CAS

CAS 全稱compareAndSet,比較并交換的意思,CAS為無鎖操作(其實(shí)就是CPU級(jí)別的鎖,跟操作系統(tǒng)沒關(guān)系,而且CPU級(jí)別的鎖比較快)。

顧名思義CAS操作分為兩步,先比較后交換。既然要進(jìn)行比較然后在進(jìn)行交換,那肯定是涉及到了三個(gè)參數(shù),自己V、和誰進(jìn)行比較 E、比較完之后需要修改成誰 U。

V即為需要進(jìn)行比較的參數(shù),E為變量在內(nèi)存中的最新值,U為需要修改的值。CAS在接收到三個(gè)參數(shù)后,先對(duì)V和E進(jìn)行比較,如果V=E證明變量V沒有被其他線程修改過,CAS就會(huì)把V替換成U;如V != E 證明這個(gè)變量已經(jīng)被其他線程修改了,所以CVS認(rèn)為本次操作是一次無效操作,不會(huì)進(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
 }

上面代碼中,第一步是定義了一個(gè)原子性的整數(shù)類型atomicInteger,它的值為10;第二步對(duì)這個(gè)value進(jìn)行CAS操作,因?yàn)锳tomicInteger對(duì)CAS進(jìn)行了封裝,V永遠(yuǎn)是AtomicInteger內(nèi)部的value,所以第二步的CAS少了V這個(gè)參數(shù),CAS拿到atomicInteger變量的value和傳進(jìn)去的第一個(gè)參數(shù)進(jìn)行比較,通過比較發(fā)現(xiàn)value = 10 這個(gè)條件是成立的,于是就把第二個(gè)參數(shù)11替換成了原來的10(整個(gè)第二步是原子性操作),并且返回一個(gè)boolean類型的操作成功true;第三步CAS又拿著自己的value 11(因?yàn)樵诘诙揭呀?jīng)替換成為11了)和第一個(gè)參數(shù) 10 進(jìn)行比較,通過比較發(fā)現(xiàn)11 != 10 條件不成立,于是不進(jìn)行任何操作,并且返回一個(gè)boolean類型的操作失敗 false。

JAVA中哪些地方用到來CAS

目前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)前對(duì)象的value。

第二步:updateFunction為函數(shù)引用,不過他的操作也是為了賦值,并返回預(yù)期結(jié)果。

第三步:進(jìn)行CAS操作,傳入第一步get()獲取到的值和目前對(duì)象中的值進(jìn)行比較,如果一樣就修改為next,不一樣就繼續(xù)循環(huán),直到CAS操作返回true為止。

第四步:返回當(dāng)前獲取到的值prev。

感謝各位的閱讀,以上就是“JAVA中哪些地方用到CAS”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)JAVA中哪些地方用到CAS這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

分享文章:JAVA中哪些地方用到CAS
文章位置:http://bm7419.com/article44/pccche.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、網(wǎng)頁設(shè)計(jì)公司面包屑導(dǎo)航、外貿(mào)網(wǎng)站建設(shè)自適應(yīng)網(wǎng)站、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)