CAS 的執行流程 ?CAS 中 ABA 問題如何解決 ?CAS 在 Java 中有哪些實現類 ?

目錄

1. CAS 的執行流程

2. CAS 中的 ABA 問題

3. 如何解決 CAS 中的 ABA 問題

4.CAS 在Java 中的實現類有哪些


1. CAS 的執行流程

CAS 比較并替換的大致流程是這樣的:

  • 它有三個操作單位:V(內存值),A(預期的舊值),B(新值),
  • 比較 V 的值和 A 的值是否相等,
  • 如果相等的話,則將 V 的值替換成 B,否則就提示用戶修改失敗。

正常情況(沒有其他線程修改內存值):

?特殊情況(有其他線程干擾修改值):

2. CAS 中的 ABA 問題

????????什么是 ABA 問題呢 ? 對于上圖中的有其他線程修改內存值的情況,當線程 1 在執行 CAS 之前,如果有兩個線程過來修改內存中的值了:線程 2 將原來的值給修改了,線程 3 又把內存的值給改回來了,這個時候線程 1 再去執行 CAS 就會出問題,這個就是 ABA 問題。

【舉個例子

比如說張三原來賬上有 200 元,此時張三需要給李四轉賬 100 元,如果在轉賬的時候不小心點了兩次提交,那么此時就會執行兩次 CAS。

① 正常情況下,沒有其他人給我轉賬的時候 >>

第一次 CAS :

  • A(舊值):200
  • B(新值):100
  • V(內存值):200
  1. 比較 V 和 A 的值
  2. 相等,張三 - 100 元,李四?+ 100 元
  3. 扣款成功(張三余額 100 元)

第二次 CAS:

  • A(舊值):200
  • B(新值):100
  • V(內存值):100
  1. 比較 V 和 A 的值
  2. 不相等,不能進行扣款操作
  3. 扣款失敗(張三余額 100 元)

② ABA 情況,轉賬途中有第三方介入 >>

第一次 CAS :

  • A(舊值):200
  • B(新值):100
  • V(內存值):200
  1. 比較 V 和 A 的值
  2. 相等,張三 - 100 元,李四?+ 100 元
  3. 扣款成功(張三余額 100 元)

在第二次 CAS 之前,此時張三的哥們王五剛好還了張三 100 元,此時 V(內存值)被改為了 200,也就是說張三此時賬上的余額又變回了?200。

第二次 CAS:

  • A(舊值):200
  • B(新值):100
  • V(內存值):200
  1. 比較 V 和 A 的值
  2. 相等,張三 - 100 元,李四?+ 100 元
  3. 扣款成功(張三余額 100 元)

上述有第三方介入的情況,原本張三在轉賬 100 元之后,賬戶上應該還剩 20 元的,最終卻只剩 100 元了,這就是 CAS 的 ABA 問題。

3. 如何解決 CAS 中的 ABA 問題

常見的辦法就是引入版本號(version)!!

還是上述轉賬的例子,只不過這次給每個線程的操作都加上新的版本號:

① 線程一(張三):獲取原內存值 200_version_1 ,比較 V 和 A,相等,扣款成功,然后將內存值修改為 100_version_2。

② 線程三(王五):獲取原內存值 100_version_2,比較 V 和 A,相等,轉賬成功,然后將內存值修改為 200_version_3。

③ 線程二(張三):獲取原內存值 200_version_3,比較 V 和 A(200_version_1),不相等,扣款失敗,退出修改。

此時張三賬戶上余額為 200,這才是合理的。

4.CAS 在Java 中的實現類有哪些

Java 中提供的 AtomicXXX 類,都是 CAS 的具體實現。例如:AtomicInteger,AtomicLong 等等。

AtomicInteger 的底層源碼:

【面試問題】

① 此時面試官可能會問:Java 提供的 AtomicInteger 是否存在 ABA 問題 ??

答案是存在!!因為 AtomicInteger 沒有引入版本號。

② 面試官接著問:那如何解決 AtomicInteger 的 ABA 問題 ??

使用 Atomic 家族的 AtomicStampedReference 類,它在使用的時候,必須指定一個版本號,并且它的對象在調用?CAS 的方法時,它需要設置 4 個參數,分別是:

  • 舊值 A
  • 新值 B
  • 當前版本
  • 執行修改后的版本號

所以使用這個類可以解決 ABA 問題。

AtomicStampedReference<Integer> as = new AtomicStampedReference<>(100,1);
as.compareAndSet(200,100,1,2); // 舊值,新值,當前版本號,修改后的版本號

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38552.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38552.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38552.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

3D沉浸式旅游網站開發案例復盤【Three.js】

Plongez dans Lyon網站終于上線了。 我們與 Danka 團隊和 Nico Icecream 共同努力&#xff0c;打造了一個令我們特別自豪的流暢的沉浸式網站。 這個網站是專為 ONLYON Tourism 和會議而建&#xff0c;旨在展示里昂最具標志性的活動場所。觀看簡短的介紹視頻后&#xff0c;用戶…

Android 面試筆記整理-Binder機制

作者&#xff1a;浪人筆記 面試可能會問到的問題 從IPC的方式問到Binder的優勢為什么zygote跟其他服務進程的通訊不使用BinderBinder線程池和Binder機制 等等這些問題都是基于你對Binder的理解還有對其他IPC通訊的理解 IPC方式有多少種 傳統的IPC方式有Socket、共享內存、管道…

llvm-dyn_cast模板函數

dyn_cast dyn_cast是LLVM中用于執行安全的向下轉型&#xff08;downcasting&#xff09;的一個模板函數。在C中&#xff0c;向下轉型是將基類的指針或引用轉換為派生類的指針或引用。這種轉型在運行時進行&#xff0c;如果轉型失敗&#xff08;即&#xff0c;如果基類的對象實…

云計算虛擬仿真實訓平臺

一、云計算虛擬仿真系統概述 云計算虛擬仿真系統是一種基于云計算技術和虛擬化技術的系統&#xff0c;用于實現各種仿真和模擬任務。它可以提供強大的計算能力和資源管理&#xff0c;為用戶提供靈活、高效、可擴展的仿真環境。 該系統通常由一組服務器、網絡和存儲設備組成&am…

uniapp開發小程序-有分類和列表時,進入頁面默認選中第一個分類

一、效果&#xff1a; 如下圖所示&#xff0c;進入該頁面后&#xff0c;默認選中第一個分類&#xff0c;以及第一個分類下的列表數據。 二、代碼實現&#xff1a; 關鍵代碼&#xff1a; 進入頁面時&#xff0c;默認調用分類的接口&#xff0c;在分類接口里做判斷&#xff…

Linux c語言字節序

文章目錄 一、簡介二、大小端判斷2.1 聯合體2.2 指針2.3 網絡字節序 一、簡介 字節序&#xff08;Byte Order&#xff09;指的是在存儲和表示多字節數據類型&#xff08;如整數和浮點數&#xff09;時&#xff0c;字節的排列順序。常見的字節序有大端字節序&#xff08;Big En…

神經網絡基礎-神經網絡補充概念-08-邏輯回歸中的梯度下降算法

概念 邏輯回歸是一種用于分類問題的機器學習算法&#xff0c;而梯度下降是優化算法&#xff0c;用于更新模型參數以最小化損失函數。在邏輯回歸中&#xff0c;我們使用梯度下降算法來找到最優的模型參數&#xff0c;使得邏輯回歸模型能夠更好地擬合訓練數據。 邏輯回歸中的梯…

無監督學習之主成分分析-半導體制造高維數據如何降維

數據降維不只存在于半導體數據中&#xff0c;它是存在于各行各業的&#xff0c;我們要分析的數據維數較多的時候全部輸入維數較大這時就要采取降維的方法綜合出主要的幾列用于我們的分析。 PCA的哲學理念是要抓住問題的主要矛盾進行分析&#xff0c;是將多指標轉化為少數幾個…

前端技術棧es6+promise

let入門使用、 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>let 基本使用</title><script type"text/javascript">let name "hspedu教育";//老韓解讀//1. conso…

蘋果Mac像Windows一樣使用

一、將磁盤訪問設置的像Windows一樣&#xff1a; 1.1、點擊任務欄第一個按鈕打開“訪達”&#xff0c;點擊菜單欄上的訪達-偏好設置&#xff1a; 1.2、勾選“硬盤”&#xff0c;這樣macOS的桌面上就會顯示一個本地磁盤&#xff0c;之后重命名為磁盤根&#xff0c;相當于window…

SPF9139全力適配ios16與鴻蒙3.0,超實用數據提取、分析、恢復能力UP!

? 如今&#xff0c;群聊已成為人們必不可少的溝通窗口 家人群&#xff0c;好友群&#xff0c;班級群 粉絲群&#xff0c;交友群&#xff0c;工作群 …… 各類群聊鋪天蓋地般涌來的同時 也有一些群聊淪為了 賭博、傳播淫穢視頻、發表不當言論 等違法犯罪行為滋生之地 與…

mac 可以進行單片機(stm32)的開發嗎?

當涉及到在Mac上進行單片機開發時&#xff0c;是完全可行的。以下是為什么Mac適合單片機開發的解釋&#xff1a;開發工具&#xff1a;針對STM32單片機&#xff0c;你可以使用多種開發工具。一個常用的選擇是Segger Embedded Studio&#xff0c;它是一個功能強大的集成開發環境&…

ClickHouse(十八):Clickhouse Integration系列表引擎

進入正文前&#xff0c;感謝寶子們訂閱專題、點贊、評論、收藏&#xff01;關注IT貧道&#xff0c;獲取高質量博客內容&#xff01; &#x1f3e1;個人主頁&#xff1a;含各種IT體系技術&#xff0c;IT貧道_Apache Doris,大數據OLAP體系技術棧,Kerberos安全認證-CSDN博客 &…

IDEA常用設置與maven項目部署

目錄 前言 一、Idea是什么 二、Idea的優點 三、Idea的常用設置 主題設置 設置鼠標懸浮提示 忽略大小寫提示 自動導包 取消單行顯示Tabs 設置字體 配置類文檔注釋信息模版 設置文件編碼 設置自動編譯 水平或者垂直顯示代碼 快捷方式改成eclipse 設置默認瀏覽器…

Java并發編程(六)線程池[Executor體系]

概述 在處理大量任務時,重復利用線程可以提高程序執行效率,因此線程池應運而生。 它是一種重用線程的機制,可以有效降低內存資源消耗提高響應速度。當任務到達時&#xff0c;任務可以不需要的等到線程創建就能立即執行線程池可以幫助我們更好地管理線程的生命周期和資源使用,…

Jmeter - 函數助手

目錄 __StringFromFile __CSVRead __counter __RandomString __StringFromFile StringFromFile函數用于獲取文本文件的值&#xff0c;一次讀取一行 1、輸入文件的全路徑&#xff1a;填入文件路徑 2、存儲結果的變量名&#xff08;可選&#xff09; 3、Start file sequence …

Tomcat+Http+Servlet

文章目錄 1.HTTP1.1 請求和響應HTTP請求&#xff1a;請求行請求頭請求體HTTP響應&#xff1a;響應行&#xff08;狀態行&#xff09;響應頭響應體 2. Apache Tomcat2.1 基本使用2.2 IDEA中創建 Maven Web項目2.3 IDEA中使用Tomcat 3. Servlet3.1 Servlet快速入門3.2 Servlet執行…

游戲中的UI適配

引用參考&#xff1a;感謝GPT UI適配原理以及常用方案 游戲UI適配是確保游戲界面在不同設備上以不同的分辨率、屏幕比例和方向下正常顯示的關鍵任務。下面是一些常見的游戲UI適配方案&#xff1a; 1.分辨率無關像素&#xff08;Resolution-Independent Pixels&#xff09;&a…