亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

CAS 操作原理

1. 前言

本節內容主要是對 CAS 操作原理進行講解,由于 CAS 涉及到了并發編程包的使用,本節課程只對 CAS 的原理問題進行講解,有助于同學后續對并發編程工具使用的學習。本節具體內容點如下:

  • 了解 CAS 的概念,這是本節內容的基礎知識;
  • 了解 CAS 誕生的背景,能夠更好地理解 CAS,這是本節的基礎知識;
  • 了解 CAS 操作誕生的意義,這也是 CAS 操作的作用所在;
  • 了解 CAS 的操作原理,這也是本節內容的核心知識點,其他知識點都是圍繞這一知識點展開的;
  • 了解 CAS 中常見的 ABA 問題,這是本節內容的重點。

2. 什么是 CAS

概念:CAS 是 CompareAndSwap 的簡稱,是一種用于在多線程環境下實現同步功能的機制。

從字面上理解就是比較并更新。簡單來說,從某一內存上取值 V,和預期值 A 進行比較,如果內存值 V 和預期值 A 的結果相等,那么我們就把新值 B 更新到內存,如果不相等,那么就重復上述操作直到成功為止。

3. CAS 誕生的背景

synchronized 時代:在多線程中為了保持數據的準確性,避免多個線程同時操作某個變量,很多情況下利用關鍵字 synchronized 實現同步鎖。

使用 synchronized 關鍵字可以使操作的線程排隊等待運行,可以說是一種悲觀策略,認為線程會修改數據,所以開始就把持有鎖的線程鎖住,其他線程只能是掛起狀態,等待鎖的釋放,所以同步鎖帶來了效率問題。

synchronized 時代效率問題:在線程執行的時候,獲得鎖的線程在運行,其他被掛起的線程只能等待著持有鎖的線程釋放鎖才有機會運行,在效率上都浪費在等待上。

在很多的線程切換的時候,由于有同步鎖,就要涉及到鎖的釋放,加鎖,這又是一個很大的時間開銷。

volatile 時代:與鎖(阻塞機制)的方式相比有一種更有效地方法,非阻塞機制,同步鎖帶來了線程執行時候之間的阻塞,而這種非阻塞機制在多個線程競爭同一個數據的時候不會發生阻塞的情況,這樣在時間上就可以節省出很多的時間。

我們會想到用 volatile,使用 volatile 不會造成阻塞,volatile 保證了線程之間的內存可見性和程序執行的有序性可以說已經很好的解決了上面的問題。

volatile 時代原子操作問題:一個很重要的問題就是,volatile 不能保證原子性,對于復合操作,例如 i++ 這樣的程序包含三個原子操作:取值,增加,賦值。

4. CAS 操作誕生的意義

意義:從上邊 CAS 操作誕生的背景所說的,CAS(Compare And Swap 比較和交換)解決了 volatile 不能保證原子性的問題。從而 CAS 操作即能夠解決鎖的效率問題,也能夠保證操作的原子性。

Tips:在 JDK1.5 新增的 java.util.concurrent (JUC java 并發工具包) 就是建立在 CAS 之上的。相比于 synchronized 這種堵塞算法, CAS 是非堵塞算法的一種常見實現。所以 JUC 在性能上有了很大的提升。

5. CAS 操作原理

CAS 主要包含三個操作數,內存位置 V,進行比較的原值 A,和新值 B。

當位置 V 的值與 A 相等時,CAS 才會通過原子方式用新值 B 來更新 V,否則不會進行任何操作。無論位置 V 的值是否等于 A,都將返回 V 原有的值。
圖片描述

上面說到了同步鎖是一種悲觀策略,CAS 是一種樂觀策略,每次都開放自己,不用擔心其他線程會修改變量等數據,如果其他線程修改了數據,那么 CAS 會檢測到并利用算法重新計算。

CAS 也是同時允許一個線程修改變量,其他的線程試圖修改都將失敗,但是相比于同步鎖,CAS 對于失敗的線程不會將他們掛起,他們下次仍可以參加競爭,這也就是非阻塞機制的特點。

6. ABA 問題

ABA 問題描述

  • 假設有兩個線程,線程 1 和線程 2,線程 1 工作時間需要 10 秒,線程 2 工作需要 2 秒;
  • 主內存值為 A,第一輪線程 1 和線程 2 都把 A 拿到自己的工作內存;
  • 第 2 秒,線程 2 開始執行,線程 2 工作完成把 A 改成了 B ;
  • 第 4 秒,線程 2 把 B 又改成了 A,然后就線程 2 進入休眠狀態;
  • 第 10 秒,線程 1 工作完成,看到期望為 A 真實值也是 A 認為沒有人動過,其實 A 已經經過了修改,只不過又改了回去,然后線程 1 進行 CAS 操作。

ABA 問題解決:為了解決這個問題,在每次進行操作的時候加上一個版本號或者是時間戳即可。

7. 小結

本節內容的核心知識點即了解 CAS 的操作原理,其他知識點都是圍繞這一知識點展開的,對于 CAS 中所引發的 ABA 問題以及該問題的解決方式為本節內容重點。需要對這兩點進行著重掌握。