CAS與原子操作

      網友投稿 872 2025-04-03

      樂觀鎖與悲觀鎖的概念


      鎖可以從不同的角度分類。其中,樂觀鎖和悲觀鎖是一種分類方式。

      悲觀鎖:

      CAS與原子操作

      悲觀鎖就是我們常說的鎖。對于悲觀鎖來說,它總是認為每次訪問共享資源時會發生沖突,所以必須對每次數據操作加上鎖,以保證臨界區的程序同一時間只能有一個線程在執行。

      樂觀鎖:

      樂觀鎖又稱為“無鎖”,顧名思義,它是樂觀派。樂觀鎖總是假設對共享資源的訪問沒有沖突,線程可以不停地執行,無需加鎖也無需等待。而一旦多個線程發生沖突,樂觀鎖通常是使用一種稱為CAS的技術來保證線程執行的安全性

      由于無鎖操作中沒有鎖的存在,因此不可能出現死鎖的情況,也就是說樂觀鎖天生免疫死鎖。

      樂觀鎖多用于“讀多寫少“的環境,避免頻繁加鎖影響性能;而悲觀鎖多用于”寫多讀少“的環境,避免頻繁失敗和重試影響性能。

      CAS的概念

      CAS的全稱是:比較并交換(Compare And Swap)。在CAS中,有這樣三個值:

      V:要更新的變量(var)

      E:預期值(expected)

      N:新值(new)

      比較并交換的過程如下:

      判斷V是否等于E,如果等于,將V的值設置為N;如果不等,說明已經有其它線程更新了V,則當前線程放棄更新,什么都不做。

      所以這里的預期值E本質上指的是“舊值”。

      我們以一個簡單的例子來解釋這個過程:

      如果有一個多個線程共享的變量i原本等于5,我現在在線程A中,想把它設置為新的值6;

      我們使用CAS來做這個事情;

      首先我們用i去與5對比,發現它等于5,說明沒有被其它線程改過,那我就把它設置為新的值6,此次CAS成功,i的值被設置成了6;

      如果不等于5,說明i被其它線程改過了(比如現在i的值為2),那么我就什么也不做,此次CAS失敗,i的值仍然為2。

      在這個例子中,i就是V,5就是E,6就是N。

      那有沒有可能我在判斷了i為5之后,正準備更新它的新值的時候,被其它線程更改了i的值呢?

      不會的。因為CAS是一種原子操作,它是一種系統原語,是一條CPU的原子指令,從CPU層面保證它的原子性

      當多個線程同時使用CAS操作一個變量時,只有一個會勝出,并成功更新,其余均會失敗,但失敗的線程并不會被掛起,僅是被告知失敗,并且允許再次嘗試,當然也允許失敗的線程放棄操作。

      任務調度

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:pdf文檔在線壓縮(PDF壓縮 在線)
      下一篇:Excel中進行表格單元格里進行分行的操作技巧(excel表格單元格里的內容怎么分行)
      相關文章
      一本久久综合亚洲鲁鲁五月天| 久久国产亚洲观看| 亚洲国产天堂在线观看| 亚洲精品国产精品乱码不卞| 亚洲暴爽av人人爽日日碰| 噜噜综合亚洲AV中文无码| 亚洲风情亚Aⅴ在线发布| 亚洲国产无线乱码在线观看 | 亚洲av成人综合网| 久久水蜜桃亚洲AV无码精品| 亚洲日本VA午夜在线影院| 亚洲欧美日韩综合久久久| 亚洲欧美在线x视频| 日日摸日日碰夜夜爽亚洲| vvvv99日韩精品亚洲| 亚洲AV性色在线观看| 激情小说亚洲色图| 亚洲AⅤ无码一区二区三区在线| 亚洲精品国产摄像头| 亚洲AV无码AV吞精久久| 国产亚洲综合久久| 亚洲人成影院在线观看| 国产日韩成人亚洲丁香婷婷| 亚洲午夜无码久久久久| 亚洲成AV人片在线观看| 亚洲AV无码一区二区二三区软件| 日本红怡院亚洲红怡院最新| 亚洲人成在线影院| 亚洲婷婷在线视频| 亚洲欧美日韩中文二区| 国产亚洲Av综合人人澡精品| 亚洲中文字幕无码爆乳av中文| 伊人久久精品亚洲午夜| 久久久亚洲精品国产| 亚洲欧洲日韩综合| 亚洲欧洲无码一区二区三区| 国产精品亚洲一区二区三区在线观看| 亚洲国产精品自在拍在线播放| 一本久久a久久精品亚洲| 久久亚洲精品人成综合网| 亚洲人成777在线播放|