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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java 锁之 CAS

發(fā)布時(shí)間:2023/12/4 java 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 锁之 CAS 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是CAS(compare and swap)?

CAS(Compare & Set,或是 Compare & Swap),即比較并交換,也是實(shí)現(xiàn)我們平時(shí)所說的自旋鎖或樂觀鎖的核心操作。

它的實(shí)現(xiàn)很簡單,就是用一個(gè)預(yù)期的值和內(nèi)存值進(jìn)行比較,如果兩個(gè)值相等,就用預(yù)期的值替換內(nèi)存值,并返回 true。否則,返回 false。

  • CAS是線程并發(fā)算法時(shí)用到的一種技術(shù)
  • CAS是原子操作,保證并發(fā)安全,而不是保證并發(fā)同步
  • CAS是CPU的一個(gè)指令
  • CAS是非阻塞的、輕量級的樂觀鎖

CAS的原子性是由CPU硬件指令實(shí)現(xiàn)保證的,即使用JNI調(diào)用native方法調(diào)用由C++編寫的硬件級別指令,jdk中提供了Unsafe類執(zhí)行這些操作。

為什么說CAS是樂觀鎖?

樂觀鎖,嚴(yán)格來說并不是鎖,通過原子性來保證數(shù)據(jù)的同步,比如說數(shù)據(jù)庫的樂觀鎖,通過版本控制來實(shí)現(xiàn)等,所以CAS不會(huì)保證線程同步。樂觀的認(rèn)為在數(shù)據(jù)更新期間沒有其他線程影響

CAS原理

CAS就是將內(nèi)存值更新為需要的值,但是有個(gè)條件,內(nèi)存值必須與期望值相同。舉個(gè)例子,期望值 E、內(nèi)存值M、更新值U,當(dāng)E == M的時(shí)候?qū)更新為U。

CAS應(yīng)用

由于CAS是CPU指令,我們只能通過JNI與操作系統(tǒng)交互,關(guān)于CAS的方法都在sun.misc包下Unsafe的類里 java.util.concurrent.atomic包下的原子類等通過CAS來實(shí)現(xiàn)原子操作。

CAS優(yōu)缺點(diǎn)

優(yōu)點(diǎn)
非阻塞的輕量級的樂觀鎖,通過CPU指令實(shí)現(xiàn),在資源競爭不激烈的情況下性能高,相比synchronized重量鎖,synchronized會(huì)進(jìn)行比較復(fù)雜的加鎖,解鎖和喚醒操作。
缺點(diǎn)

  • ABA問題:線程C、D,線程D將A修改為B后又修改為A,此時(shí)C線程以為A沒有改變過,java的原子類AtomicStampedReference,通過控制變量值的版本來保證CAS的正確性。
  • 自旋時(shí)間過長,消耗CPU資源:如果資源競爭激烈,多線程自旋長時(shí)間消耗資源。
  • CAS只能保證一個(gè)共享變量的原子操作。如果有多個(gè)變量,就只能采用別的方式:如悲觀鎖
  • CAS總結(jié)

    CAS不僅是樂觀鎖,是種思想,我們也可以在日常項(xiàng)目中通過類似CAS的操作保證數(shù)據(jù)安全,但并不是所有場合都適合,

    曾看過帖子說,能用synchronized就不要用CAS,除非遇到性能瓶頸,因?yàn)镃AS會(huì)讓代碼可讀性變差,這句話看大家怎么理解了。

    拓展:
    https://www.cnblogs.com/Mainz/p/3546347.html

    總結(jié)

    以上是生活随笔為你收集整理的Java 锁之 CAS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。