日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java并发之CAS

發布時間:2023/12/4 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java并发之CAS 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

文章目錄

    • 1:何為CAS
    • 2:CAS圖示
    • 3:CAS和Volatile的關系
    • 4:為何CAS效率更高一些
    • 5:CAS的特點
    • 7:受保護得共享數據類型
      • (1):原子基本數據類型
      • (2):原子引用數據類型
    • 7:ABA問題
      • (1):什么是ABA
      • (2):如何解決呢?


1:何為CAS

  • CAS(Compare And Swap),即比較并交換。是解決多線程并行情況下使用鎖造成性能損耗的一種機制。
  • CAS操作包含三個操作數——內存位置(V)、預期原值(A)和新值(B)。如果內存位置的值與預期原值相匹配,那么處理器會自動將該位置值更新為新值。否則,處理器不做任何操作。
  • CAS有效地說明了“我認為位置V應該包含值A;如果包含該值,則將B放到這個位置;否則,不要更改該位置,只告訴我這個位置現在的值即可。

2:CAS圖示

  • 我們對共享資源(balance)用 AtomicInteger修飾,調用其compareAndSet方法使每次更余額的時候,我們的余額都是最新值。
  • 流程展示

解釋:圖示中的注釋中線程2對共享變量的操作發生在 線程1 中 (int next = prev - amount 和 if …之間)在這其中發生了上下文切換。

3:CAS和Volatile的關系

  • 獲取共享變量時,需要用到volatile修飾變量,來保證變量的可見性;
  • CAS必須借助volatile才能讀取到共享變量的最新值,來實現比較交換。

4:為何CAS效率更高一些

  • 無鎖情況下,即使重試失敗,線程始終在高速運行,沒有停歇,而synchronized會讓線程在沒有獲得鎖的
    時候,發生上下文切換,進入阻塞。打個比喻
  • 線程就好像高速跑道上的賽車,高速運行時,速度超快,一旦發生上下文切換,就好比賽車要減速、熄
    火,等被喚醒又得重新打火、啟動、加速.恢復到高速運行,代價比較大
  • 但無鎖情況下,因為線程要保持運行,需要額外CPU的支持,CPU在這里就好比高速跑道,沒有額外的
    跑道,線程想高速運行也無從談起,雖然不會進入阻塞,但由于沒有分到時間片,仍然會進入可阻塞狀
    態,還是會導致上下文切換。

5:CAS的特點

結合CAS和volatile可以實現無鎖并發,適用于線程數少、多核CPU的場景下。

  • CAS是基于樂觀鎖的思想:最樂觀的估計,不怕別的線程來修改共享變量,就算改了也沒關系,我吃虧
    點再重試唄。
  • synchronized是基于悲觀鎖的思想:最悲觀的估計,得防著其它線程來修改共享變量,我上了鎖你們都別
    想改,我改完了解開鎖,你們才有機會。
  • CAS體現的是== 無鎖并發、無阻塞并發 == ,請仔細體會這兩句話的意思
    • 因為沒有使用synchronized,所以線程不會陷入阻塞,這是效率提升的因素之一
    • 但如果競凈激烈,可以想到重試必然頻繁發生,反而效率會受影響(這里的重試就是,pre值和內存值不一樣,CAS返回的結果false,那么的話我們再進行一次CAS操作)

7:受保護得共享數據類型

(1):原子基本數據類型

(2):原子引用數據類型

7:ABA問題

(1):什么是ABA

本來主線程從主存中獲取到的值是A,然后我們進行CAS中的比較也是和主存中的A進行比較,但是如果有線程在主線程CAS操作之前將A改為B,又將B改為A的話,那么主線程是感知不到的。

(2):如何解決呢?

如果主線程希望只要有其他線程動過了,共享變量的話,那么自己的CAS操作就算失敗,這時僅僅是比較值是不夠的,還要增加一個版本號,只要有人動過共享變量的話,那么版本號就會發生相應的變化,一旦主線程發現版本號不同的話,那么我們就CAS操作失敗

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的java并发之CAS的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。