CAS基本原理

什么是原子性

原子不可分割(在還未發(fā)現(xiàn)原子核與電子時(shí))。
假設(shè)有兩個(gè)線程,從一個(gè)線程看,另一個(gè)線程要么全部執(zhí)行完,要么不執(zhí)行,那么連個(gè)線程彼此具有原子性。
實(shí)現(xiàn)原子操作可以使用鎖,鎖機(jī)制就可以滿足基本問題了,但是我們需求沒有那么簡單,我們需要更效率更靈活的機(jī)制。

問題:如果大量線程來競爭資源,那么cpu將花費(fèi)大量的時(shí)間和資源來處理這些競爭

實(shí)現(xiàn)原子操作還可以使用當(dāng)前處理器都支持CAS的指令
每一個(gè)CAS指令的操作過程包含三個(gè)運(yùn)算符:內(nèi)存地址v,期望值A(chǔ),新值B,如果這個(gè)內(nèi)存地址存放的值等于期望值A(chǔ),則將地址上的值賦予新值B,否則不做任何操作。
循環(huán)CAS不斷的執(zhí)行CAS操作,直到成功為止


CAS基本原理

CAS的三大問題

1.ABA問題
2.循環(huán)時(shí)間長開銷大
3.只能保證一個(gè)共享變量的原則操作
AtomicReference 可以把多個(gè)變量放在一個(gè)對象中進(jìn)行操作

JDK中相關(guān)原子操作類

AtomicInteger

    /**
     * 以原子方式將給定值添加到當(dāng)前值。
     * 返回結(jié)果
     */
    public final int addAndGet(int delta){
        return U.getAndAddInt(this, VALUE, delta) + delta;
    }

    /**
     * 如果當(dāng)前值是期望值,則以原子方式將該值設(shè)置為給定的更新值。
     */
    public final boolean compareAndSet(int expect, int update) {
        return U.compareAndSwapInt(this, VALUE, expect, update);
    }

    /**
     * 以原子方式將當(dāng)前值增加一
     * 返回自增前的值
     */
    public final int getAndIncrement() {
        return U.getAndAddInt(this, VALUE, 1);
    }

    /**
     * 以原子方式設(shè)置為給定值
     *返回舊值
     */
    public final int getAndSet(int newValue) {
        return U.getAndSetInt(this, VALUE, newValue);
    }

AtomicIntegerArray

    /**
     * 對內(nèi)部數(shù)組進(jìn)行修改,不會影響傳入的數(shù)組
     */
    public AtomicIntegerArray(int[] array) {
        // Visibility guaranteed by final field guarantees
        this.array = array.clone();
    }

    /**
     * 以原子方式將給定值添加到索引為 i的元素。
     * 返回更新后的值
     */
    public final int addAndGet(int i, int delta) {
        return getAndAdd(i, delta) + delta;
    }

    /**
     * 如果當(dāng)前值是期望值,則以原子方式將索引 i的元素設(shè)置為給定的更新值。
     */
    public final boolean compareAndSet(int i, int expect, int update) {
        return compareAndSetRaw(checkedByteOffset(i), expect, update);
    }

AtomicReference
AtomicStampedReference
以版本戳的形式記錄了每次改變以后的版本號,解決了ABA問題
AtomicMarkableReference
與AtomicStampedReference相似,
AtomicStampedReference記錄的修改次數(shù);
AtomicMarkableReference記錄是否修改過。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是原子操作?如何實(shí)現(xiàn)原子操作? 假定有兩個(gè)操作A和B(A和B可能都很復(fù)雜),如果從執(zhí)行A的線程來看,當(dāng)另一個(gè)線...
    dashu52閱讀 438評論 0 0
  • CAS? 比較并交換(compare and swap, CAS),是原子操作的一種,可用于在多線程編程中實(shí)現(xiàn)不被...
    仕明同學(xué)閱讀 1,765評論 0 1
  • 并發(fā)基礎(chǔ)知識補(bǔ)全 Callable、Future和FutureTask 在前文(線程基礎(chǔ)、線程之間的共享與協(xié)作)中...
    暮暮頻顧惜閱讀 302評論 0 0
  • 什么是CAS? CAS為 compare and swap (判斷并且交換) 什么是原子操作? 原子操作的基本概念...
    tangYaXin閱讀 410評論 0 0
  • 推薦指數(shù): 6.0 書籍主旨關(guān)鍵詞:特權(quán)、焦點(diǎn)、注意力、語言聯(lián)想、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析,社會...
    Jenaral閱讀 5,950評論 0 5

友情鏈接更多精彩內(nèi)容