第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

CAS 操作原理

1. 前言

本節(jié)內(nèi)容主要是對 CAS 操作原理進(jìn)行講解,由于 CAS 涉及到了并發(fā)編程包的使用,本節(jié)課程只對 CAS 的原理問題進(jìn)行講解,有助于同學(xué)后續(xù)對并發(fā)編程工具使用的學(xué)習(xí)。本節(jié)具體內(nèi)容點(diǎn)如下:

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

2. 什么是 CAS

概念:CAS 是 CompareAndSwap 的簡稱,是一種用于在多線程環(huán)境下實(shí)現(xiàn)同步功能的機(jī)制。

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

3. CAS 誕生的背景

synchronized 時(shí)代:在多線程中為了保持?jǐn)?shù)據(jù)的準(zhǔn)確性,避免多個(gè)線程同時(shí)操作某個(gè)變量,很多情況下利用關(guān)鍵字 synchronized 實(shí)現(xiàn)同步鎖。

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

synchronized 時(shí)代效率問題:在線程執(zhí)行的時(shí)候,獲得鎖的線程在運(yùn)行,其他被掛起的線程只能等待著持有鎖的線程釋放鎖才有機(jī)會運(yùn)行,在效率上都浪費(fèi)在等待上。

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

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

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

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

4. CAS 操作誕生的意義

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

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

5. CAS 操作原理

CAS 主要包含三個(gè)操作數(shù),內(nèi)存位置 V,進(jìn)行比較的原值 A,和新值 B。

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

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

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

6. ABA 問題

ABA 問題描述

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

ABA 問題解決:為了解決這個(gè)問題,在每次進(jìn)行操作的時(shí)候加上一個(gè)版本號或者是時(shí)間戳即可。

7. 小結(jié)

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