国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JUC并發(fā)編程學(xué)習(xí)筆記(十八)深入理解CAS

這篇具有很好參考價值的文章主要介紹了JUC并發(fā)編程學(xué)習(xí)筆記(十八)深入理解CAS。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

深入理解CAS

什么是CAS

為什么要學(xué)CAS:大廠你必須深入研究底層!有所突破!

java層面的cas------->compareAndSet

compareAndSet(int expectedValue, int newValue) 期望并更新,達到期望值就更新、否則就不更新!

package org.example.cas;

import java.util.concurrent.atomic.AtomicInteger;

public class CASDemo {
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(2020);
        //JAVA CAS -> 比較并交換
        //期望、更新
        //compareAndSet(int expectedValue, int newValue)
        //如果我期望的值達到了那么就跟新、否則就不更新;CAS 是CPU的并發(fā)原語!
        System.out.println(atomicInteger.compareAndSet(2020, 2021));
        //達到期望值更新成功
        System.out.println(atomicInteger.get());
        //更新后未達到期望值,更新失敗
        System.out.println(atomicInteger.compareAndSet(2020, 2021));
        System.out.println(atomicInteger.get());
    }
}

Unsafe類

java不能直接操作內(nèi)存,但是可以調(diào)用c++,c++可以操作內(nèi)存,java可以通過native關(guān)鍵字定義的方法來調(diào)用c++。Unsafe類就像是java留給自己的一個后門。所以Unsafe類中都是native方法和調(diào)用native方法的方法!

在原子類里,有一個getAndIncrement方法用作自增、那么他的底層是如何實現(xiàn)的呢?

其實就是調(diào)用的unsafe類中的getAndAddInt方法

public final int getAndIncrement() {
    //dalta傳入了1
    return U.getAndAddInt(this, VALUE, 1);
}
public final int getAndAddInt(Object o, long offset, int delta) {
    int v;
    do {
        //v每次都跟新為最新值,所以一直會是期望的值!就執(zhí)行了++的操作
        v = getIntVolatile(o, offset);
        //如果當(dāng)前對象o期望的值等于v,那么將當(dāng)前對象o的值跟新為v+dalta;
    } while (!weakCompareAndSetInt(o, offset, v, v + delta));
    return v;
}
public final boolean weakCompareAndSetInt(Object o, long offset,
                                              int expected,
                                              int x) {
        return compareAndSetInt(o, offset, expected, x);
    }
public final native boolean compareAndSetInt(Object o, long offset,
                                                 int expected,
                                                 int x);

對比觀察,其實getAndAddInt就是定義一個變量取到最新的值,然后通過while循環(huán)一直更新,其中g(shù)etIntVolatile和compareAndSetInt都是通過java調(diào)用底層c++操作內(nèi)存。

其中用到了一段標(biāo)準(zhǔn)的鎖(自旋鎖!):

 do {
        //v每次都跟新為最新值,所以一直會是期望的值!就執(zhí)行了++的操作
        v = getIntVolatile(o, offset);
        //如果當(dāng)前對象o期望的值等于v,那么將當(dāng)前對象o的值跟新為v+dalta;
    } while (!weakCompareAndSetInt(o, offset, v, v + delta));

缺點

1、循環(huán)會耗時

2、一次性只能保證一個共享變量的原子性

3、會存在ABA問題

優(yōu)點

自帶原子性

CAS : ABA問題(貍貓換太子)!

JUC并發(fā)編程學(xué)習(xí)筆記(十八)深入理解CAS文章來源地址http://www.zghlxwxcb.cn/news/detail-750313.html

package org.example.cas;

import java.util.concurrent.atomic.AtomicInteger;

public class CASDemo {
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(2020);
        //JAVA CAS -> 比較并交換
        //期望、更新
        //compareAndSet(int expectedValue, int newValue)
        //如果我期望的值達到了那么就跟新、否則就不更新;   CAS 是CPU的并發(fā)原語!
        //===============搗亂的線程================
        System.out.println(atomicInteger.compareAndSet(2020, 2021));
        System.out.println(atomicInteger.compareAndSet(2021, 2020));
        //達到期望值更新成功
        System.out.println(atomicInteger.get());
        //更新后未達到期望值,更新失敗
        //===============期望的線程================
        System.out.println(atomicInteger.compareAndSet(2020, 2021));
        System.out.println(atomicInteger.get());
        //getAndIncrement number++ 底層如何實現(xiàn)的?
        atomicInteger.getAndIncrement();//++方法

    }
}

到了這里,關(guān)于JUC并發(fā)編程學(xué)習(xí)筆記(十八)深入理解CAS的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • JUC并發(fā)編程學(xué)習(xí)筆記(十六)Volatile

    JUC并發(fā)編程學(xué)習(xí)筆記(十六)Volatile

    保證可見性 使用了volatile,即可保證它本身可被其他線程的工作內(nèi)存感知,即變化時也會被同步變化。 不保證原子性 原子性:不可分割 線程A在執(zhí)行任務(wù)時是不可被打擾的,也不能被分割,要么同時成功,要么同時失敗。 每次結(jié)果也不一樣。 如果不加Lock加synchronize

    2024年02月05日
    瀏覽(18)
  • JUC并發(fā)編程學(xué)習(xí)筆記(十四)異步回調(diào)

    JUC并發(fā)編程學(xué)習(xí)筆記(十四)異步回調(diào)

    Future設(shè)計的初衷:對將來的某個事件的結(jié)果進行建模 在Future類的子類中可以找到CompletableFuture,在介紹中可以看到這是為非異步的請求使用一些異步的方法來處理 點進具體實現(xiàn)類中,查看方法,可以看到CompletableFuture中的異步內(nèi)部類,里面是實現(xiàn)的異步方法 以及一些異步方法

    2024年02月05日
    瀏覽(19)
  • JUC并發(fā)編程學(xué)習(xí)筆記(十五)JMM

    JUC并發(fā)編程學(xué)習(xí)筆記(十五)JMM

    請你談?wù)剬olatile的理解 Volatile是java虛擬機提供的 輕量級的同步機制 1、保證可見性 2、不保證原子性 3、禁止指令重排 什么是JMM JVM-java虛擬機 JMM-java內(nèi)存模型,不存在的東西,概念!約定 關(guān)于JMM的一些同步的約定: 線程解鎖前,必須把共享變量 立刻 刷回主存 線程加鎖前,

    2024年02月05日
    瀏覽(25)
  • JUC并發(fā)編程學(xué)習(xí)筆記(九)阻塞隊列

    JUC并發(fā)編程學(xué)習(xí)筆記(九)阻塞隊列

    阻塞 隊列 隊列的特性:FIFO(fist inpupt fist output)先進先出 不得不阻塞的情況 什么情況下會使用阻塞隊列:多線程并發(fā)處理、線程池 學(xué)會使用隊列 添加、移除 四組API 方式 拋出異常 不拋出異常,有返回值 阻塞等待 超時等待 添加 add offer put offer(E e, long timeout, TimeUnit unit) 移

    2024年02月06日
    瀏覽(25)
  • JUC并發(fā)編程學(xué)習(xí)筆記(十九)原子引用

    帶版本號的原子操作! 解決ABA問題,引入原子引用(樂觀鎖思想) AtomicStampedReference類解決ABA問題 所有相同類型的包裝類對象之間值的比較全部使用equals方法比較 Integer使用了對象緩存機制,默認(rèn)范圍是-128至127,推薦使用靜態(tài)工廠方法valueOf獲取對象實例,而不是new,因為v

    2024年02月05日
    瀏覽(22)
  • JUC并發(fā)編程學(xué)習(xí)筆記(十)線程池(重點)

    JUC并發(fā)編程學(xué)習(xí)筆記(十)線程池(重點)

    線程池:三大方法、七大參數(shù)、四種拒絕策略 池化技術(shù) 程序的運行,本質(zhì):占用系統(tǒng)的資源!優(yōu)化資源的使用!- 池化技術(shù)(線程池、連接池、對象池......);創(chuàng)建和銷毀十分消耗資源 池化技術(shù):事先準(zhǔn)備好一些資源,有人要用就拿,拿完用完還給我。 線程池的好處: 1、

    2024年02月06日
    瀏覽(30)
  • JUC并發(fā)編程學(xué)習(xí)筆記(六)Callable(簡單)

    JUC并發(fā)編程學(xué)習(xí)筆記(六)Callable(簡單)

    callable接口和runnable接口類似,都是為了執(zhí)行另外一條線程而設(shè)計的,區(qū)別是Runnable不會返回結(jié)果也不會拋出異常。 1、可以有返回值 2、可以拋出異常 3、方法不同;run()/call(); Runnable 實現(xiàn)Runnable接口,重寫run方法,無返回值 Callable 實現(xiàn)Callable接口,重寫call方法,有返回值,可

    2024年02月06日
    瀏覽(24)
  • JUC并發(fā)編程學(xué)習(xí)筆記(四)8鎖現(xiàn)象

    八鎖-就是關(guān)于鎖的八個問題 鎖是什么,如何判斷鎖的是誰 對象、class模板 深刻理解鎖 鎖的東西無外乎就兩樣:1、同步方法的調(diào)用者,2、Class模板。 同一個鎖中,只有當(dāng)前線程資源釋放后才會被下一個線程所接手。 同步方法的調(diào)用者是兩個不同的實例時,互不相關(guān)。 靜態(tài)

    2024年02月06日
    瀏覽(26)
  • JUC并發(fā)編程學(xué)習(xí)筆記(一)認(rèn)知進程和線程

    進程 一個程序,如QQ.exe,是程序的集合 一個進程往往可以包含多個線程,至少包含一個 java默認(rèn)有兩個線程,GC垃圾回收線程和Main線程 線程:一個進程中的各個功能 java無法真正的開啟線程,因為java是運行在虛擬機上的,所以只能通過C++,通過native本地方法調(diào)用C++開啟線程

    2024年02月06日
    瀏覽(95)
  • JUC并發(fā)編程學(xué)習(xí)筆記(七)常用的輔助類

    JUC并發(fā)編程學(xué)習(xí)筆記(七)常用的輔助類

    CountDownLatch 這是一個JUC計數(shù)器輔助類,計數(shù)器有加有減,這是減。 使用方法 使用前 可能會在所有人沒出去之前關(guān)門 使用后 不在乎誰先出去,但是一定要總數(shù)等于0后才會關(guān)門 原理 countDownLatch.countDown();//總數(shù)減1 countDownLatch.await();//等待總數(shù)變?yōu)?才會往下執(zhí)行,相當(dāng)于阻塞當(dāng)

    2024年02月06日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包