什麼是CAS?CAS的作用以及缺點

2021-09-24 03:06:04 字數 1985 閱讀 4059

老顧聊技術 2019-06-03 00:28:00

精品原創技術分享,知識的組裝工

這道題是考察面試者的併發程式設計的知識,關於悲觀鎖和樂觀鎖的。

回答這個問題,可以先介紹一下鎖要解決的問題,以及鎖機制的缺點。

引入鎖就是為了解決多執行緒競爭同乙個資源時,出現髒讀、資料不一致問題。一般我們常用的是synchronized等排他鎖,

這種鎖存在的問題

1、多執行緒競爭下,加鎖、釋放鎖會導致比較多的上下文切換和排程延時,引起效能問題

2、乙個執行緒持有鎖會導致其它所有需要此鎖的執行緒掛起直至該鎖釋放

cas是另乙個無鎖解決方案,更準確的是採用樂觀鎖技術,實現執行緒安全的問題。cas有三個運算元----記憶體物件(v)、預期原值(a)、新值(b)

cas原理就是對v物件進行賦值時,先判斷原來的值是否為a,如果為a,就把新值b賦值到v物件上面,如果原來的值不是a(代表v的值放生了變化),就不賦新值。

小夥伴們應該知道j.u.c併發程式設計包,我們看一下atomicinteger類,atomicinteger是執行緒安全的,我們看一下原始碼

再看一下unsafe原始碼

我們看到do while自迴圈,這裡為什麼會有自迴圈,就是在判斷預期原值如果與原來的值不符合,會再迴圈取原值,再走cas流程,直到能夠把新值b賦值成功。

cas這個方式也存在一定的問題:

1、自迴圈時間長,開銷大2、只能保證乙個共享變數的原子操作3、aba問題

aba問題是什麼,小夥伴們自行網上看一下哦,面試也有可能問到。

-end-

如有收穫,請幫忙**,您的鼓勵是作者最大的動力,謝謝!

10幾年的經驗實戰分享

精品原創技術分享,知識的組裝工

推薦閱讀1、如何訪問redis中的海量資料?避免事故產生

2、如何解決redis熱點問題?以及如何發現熱點?

3、如何設計api介面,實現統一格式返回?

4、你真的知道在生產環境下如何部署tomcat嗎?

5、分享一線網際網路大廠分布式唯一id設計 之 snowflake方案

6、分享大廠分布式唯一id設計方案,快來圍觀

8、你知道如何處理大資料量嗎?(資料拆分篇)

9、如何永不遷移資料和避免熱點? 根據伺服器指標分配資料量(揭秘篇)

10、你知道怎麼分庫分表嗎?如何做到永不遷移資料和避免熱點嗎?

11、你了解大型**的頁面靜態化嗎?

12、你知道如何更新快取嗎?如何保證快取和資料庫雙寫一致性?

13、你知道怎麼解決db讀寫分離,導致資料不一致問題嗎?

14、db讀寫分離情況下,如何解決快取和資料庫不一致性問題?

15、你真的知道怎麼使用快取嗎?

16、如何利用鎖,防止快取擊穿?重構思想的重要性

17、海量訂單產生的業務高峰期,如何避免訊息的重複消費?

18、你知道如何保障生產端100%訊息投遞成功嗎?

什麼是Vagrant 以及作用

一 vagrant是構建在虛擬化技術之上的虛擬執行環境管理工具 1.建立和刪除虛擬機器 2.配置虛擬機器執行引數 3.管理虛擬機器執行狀態 4.自動化配置和安裝開發環境 5.打包和奮發虛擬機器執行環境 二 vagrant的執行,需要依賴某項具體的虛擬化技術 類似於virtualbox 開源的虛擬化軟...

static的作用以及實驗

1 靜態區域性變數 普通的區域性變數在棧空間上分配,這個區域性變數所在的函式被多次呼叫時,每次呼叫這個區域性變數在棧上的位置都不一定相同。區域性變數也可以在堆上動態分配,但是記得使用完這個堆空間後要釋放之。static區域性變數中文名叫靜態區域性變數。它與普通的區域性變數比起來有如下幾個區別 位置 ...

stdafx h的作用以及原理

vc工程裡面經常見到stdafx.h這個標頭檔案,以前也沒有特別注意,但是這個檔案用不好經常會出錯,所以就google了一下,總算是弄清楚了。所謂標頭檔案預編譯,就是把乙個工程 project 中使用的一些mfc標準標頭檔案 如windows.h afxwin.h 預先編譯,以後該工程編譯時,不再編...