最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多線程場景解析volatile和AtomicLong區(qū)別原理

 更新時間:2023年09月22日 11:38:46   作者:趙KK日常技術(shù)記錄  
這篇文章主要為大家介紹了Java中volatile和AtomicLong的區(qū)別原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

【摘要】

隨著多線程編程的普及,volatile和AtomicLong這兩個關(guān)鍵字被越來越多的使用。但是很多人并不理解它們的原理以及區(qū)別。今天我就來通過一個典型的場景,講解 volatile 和 AtomicLong 的用法、原理以及區(qū)別,希望可以幫助大家更好地使用這兩者。

我們假設(shè)有這樣一個多線程場景:存在一個長整型變量,多個線程同時進行讀寫操作。為了保證線程安全,我們通常會進行同步,但是同步操作又會影響效率。這個時候我們就可以考慮用 volatile 或者 AtomicLong 來優(yōu)化。

volatile

先說說 volatile,它可以保證變量的可見性,具體來說就是當(dāng)一個線程修改了 volatile 變量,新值對其他線程立即可見。這是因為volatile變量直接操作主內(nèi)存,而不是線程的工作內(nèi)存。

java
public class VolatileExample {
  volatile long count = 0;
  public void increment() {
    count++; 
  }
  public long getCount() {
    return count;
  }
}

這里通過 volatile 關(guān)鍵字,可以保證多個線程都能讀取到 count 的最新的值。但是,volatile 并不能保證原子性。什么意思呢?我們來看看下面的代碼:

java
public void increment() {
  count++;
}
// 這里的遞增操作并不是原子的,實際會分為三步
// 1. 讀取count值 
// 2. 計算值+1
// 3. 寫入新的值

也就是說某一個時刻,可能有兩個線程同時讀取了 count 值,然后分別增加,這就破壞了原子性。要解決這個問題,我們就需要 AtomicLong 了。

AtomicLong

AtomicLong 通過 CAS (Compare And Swap) 算法實現(xiàn)了對長整型的原子操作??匆粋€例子:

java
AtomicLong atomicCount = new AtomicLong();
public void increment() {
  atomicCount.getAndIncrement(); 
}

getAndIncrement()會先獲取當(dāng)前的值,然后原子地增加,最后返回舊值。這樣多個線程調(diào)用的時候可以保證原子性。AtomicLong 的 CAS 原理是通過循環(huán)調(diào)用 CAS 指令,直到更新成功為止:

java
do {
  // 獲取舊的預(yù)期值 
  oldValue = atomicCount.get();
  // 用CAS指令更新值,如果預(yù)期值一樣才更新    
  success = compareAndSet(oldValue, oldValue + 1); 
// 如果失敗,繼續(xù)循環(huán)執(zhí)行CAS  
} while(!success);

通過 CAS 不斷嘗試更新,直到成功為止。

volatile 和 AtomicLong 的區(qū)別

總結(jié)一下 volatile 和 AtomicLong 的區(qū)別

1. volatile 保證可見性,AtomicLong 保證原子性

2. volatile 不會對代碼產(chǎn)生線程鎖,AtomicLong 會通過 CAS 產(chǎn)生線程開銷

3. volatile 是通過直接操作主內(nèi)存實現(xiàn),AtomicLong 是通過 CAS 實現(xiàn)那么什么時候該用 volatile,什么時候該用 AtomicLong 呢?

  • 如果只要保證可見性,那用 volatile 即可。
  • 如果需要原子操作,如對數(shù)字進行遞增操作,這時就需要用 AtomicLong。

當(dāng)然,synchronized和Lock也能保證原子性,但是通過 CAS 實現(xiàn)的 AtomicLong 性能會更好一些。

以上就是本文的全部內(nèi)容了,通過一個典型多線程場景講解了 volatile 和 AtomicLong 的用法、原理以及區(qū)別。這兩個關(guān)鍵字非常有用,正確理解后可以充分利用它們帶來的優(yōu)勢,更多關(guān)于 Java volatile AtomicLong的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot如何開啟一個監(jiān)聽線程執(zhí)行任務(wù)

    springboot如何開啟一個監(jiān)聽線程執(zhí)行任務(wù)

    這篇文章主要介紹了springboot如何開啟一個監(jiān)聽線程執(zhí)行任務(wù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java中PrintWriter使用方法介紹

    Java中PrintWriter使用方法介紹

    這篇文章主要介紹了Java中PrintWriter使用方法介紹,文章圍繞主題展開PrintWriter使用方法的詳細介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-06-06
  • 如何將Spring Session存儲到Redis中實現(xiàn)持久化

    如何將Spring Session存儲到Redis中實現(xiàn)持久化

    這篇文章主要介紹了如何將Spring Session存儲到Redis中實現(xiàn)持久化,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Java常見的四種負載均衡算法

    Java常見的四種負載均衡算法

    本文主要介紹了Java常見的四種負載均衡算法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 使用Spring MVC攔截器實現(xiàn)日志記錄的方法

    使用Spring MVC攔截器實現(xiàn)日志記錄的方法

    本篇文章主要介紹了使用Spring MVC攔截器實現(xiàn)日志記錄的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • maven 配置多個倉庫的方法

    maven 配置多個倉庫的方法

    這篇文章主要介紹了maven 配置多個倉庫的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java Collections.shuffle()方法案例詳解

    Java Collections.shuffle()方法案例詳解

    這篇文章主要介紹了Java Collections.shuffle()方法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 淺談myBatis中的插件機制

    淺談myBatis中的插件機制

    這篇文章主要介紹了淺談myBatis中的插件機制,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 深入了解Java中成員變量與局部變量的使用與區(qū)別

    深入了解Java中成員變量與局部變量的使用與區(qū)別

    成員變量和局部變量在每種編程語言中都有涉及,本文將通過示例為大家詳細講講Java中成員變量與局部變量的使用與區(qū)別,感興趣的可以了解一下
    2022-08-08
  • Java多線程正確使用倒計時協(xié)調(diào)器CountDownLatch方法詳解

    Java多線程正確使用倒計時協(xié)調(diào)器CountDownLatch方法詳解

    這篇文章主要為大家介紹了Java多線程倒計時協(xié)調(diào)器CountDownLatch的正確使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09

最新評論

峨眉山市| 本溪市| 乳山市| 平罗县| 县级市| 新乡市| 沂水县| 伊宁市| 依安县| 锡林浩特市| 峨眉山市| 石家庄市| 称多县| 拉萨市| 阿拉善左旗| 廉江市| 五寨县| 南华县| 东乌珠穆沁旗| 临沧市| 岳西县| 浦东新区| 双江| 孟州市| 大英县| 福海县| 吉林市| 六安市| 北京市| 商河县| 容城县| 青海省| 股票| 区。| 鹰潭市| 黄骅市| 左权县| 花垣县| 宜良县| 遵义市| 临潭县|