CAS原理

synchronized這種獨占鎖屬于悲觀鎖,它是在假設一定會發生沖突的,那么加鎖恰好有用,除此之外,還有樂觀鎖,樂觀鎖的含義就是假設沒有發生沖突,那么我正好可以進行某項操作,如果要是發生沖突呢,那我就重試直到成功,樂觀鎖最常見的就是CAS

我們在讀Concurrent包下的類的源碼時,發現無論是ReenterLock內部的AQS,還是各種Atomic開頭的原子類,內部都應用到了CAS,最常見的就是我們在并發編程時遇到的i++這種情況。傳統的方法肯定是在方法上加上synchronized關鍵字:

public class Test {public volatile int i;public synchronized void add() {i++;}
}
復制代碼

但是這種方法在性能上可能會差一點,我們還可以使用AtomicInteger,就可以保證i原子的++了。

public class Test {public AtomicInteger i;public void add() {i.getAndIncrement();}
}復制代碼

CAS源碼分析

獲取偏移量valueOffset,

public native long objectFieldOffset(Field var1);通過這個方法可以知道偏移量從jdk底層源碼中獲取。

static {try {valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));} catch (Exception ex) { throw new Error(ex); }
}復制代碼

然后再看看增加的方法

public final int getAndAdd(int delta) {return unsafe.getAndAddInt(this, valueOffset, delta);
}復制代碼
public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {var5 = this.getIntVolatile(var1, var2);} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));return var5;
}復制代碼
我們看var5獲取的是什么,通過調用unsafe的getIntVolatile(var1, var2),這是個native方法,具體實現到JDK源碼里去看了,其實就是獲取var1中,var2偏移量處的值。var1就是AtomicIntegervar2就是我們前面提到的valueOffset,這樣我們就從內存里獲取到現在valueOffset處的值了

compareAndSwapInt(var1, var2, var5, var5 + var4)換成compareAndSwapInt(obj, offset, expect, update)比較清楚,意思就是如果obj內的valueexpect相等,就證明沒有其他線程改變過這個變量,那么就更新它為update,如果這一步的CAS沒有成功,那就采用自旋的方式繼續進行CAS操作

private volatile int value;和unsafe.getAndAddInt(this, valueOffset, delta);
可以看出compareAndSwapInt(obj, offset, expect, update)中的obj為AtomicInteger類型,
AtomicInteger的value值為volatile類型,在看do {var5 = this.getIntVolatile(var1, var2);} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));這里是一個dowhile循環,如果obj內的value和expect不相等,
var5 = this.getIntVolatile(var1, var2);一直會
執行,即不斷從內存中獲取最新的值,來與obj內的value進行比較直到相等為止。從這個字段可以看出復制代碼

CAS的缺點

  1. 只能保證對一個變量的原子性操作
  2. 長時間自旋會給CPU帶來壓力
  3. ABA問題


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

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

相關文章

數據分析師的職業規劃之路

“數據分析師作為一個出現時間不長的工種,大數據時代下,成為螺絲釘還是成為龍頭,需要嘗試新的可能。” 數據分析師手中擁有一座寶藏。作為滴滴出行數據分析團隊的負責人,劉普成發現了數據分析師通往卓越的秘訣:視野。數…

《設計模式》3.結構型模式

點擊進入我的博客 3.1 適配器模式 適配器模式把一個類的接口變換成客戶端所期待的另一種接口,使得原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。 3.1.1 類的適配器結構 目標(Target)角色:這就是所期待得到的接口&…

最快的計算機操作,世界十大最快的超級計算機

最近,《聯邦儲備技術》雜志對全球超級計算機進行了排名,并從中選出了十個最快的超級計算機. 其中,中國有兩臺超級計算機進入了榜單,而“天河2號”則依靠雙精度浮點算術峰. 速度達到了每秒5490億次,占據了王位.這也是兩…

蘋果iOS 10.3.1修復博通Wi-Fi芯片重大安全漏洞

如果你還沒有將設備升級到 iOS 10.3.1 的話,那么現在是個機會了。因為不久前發布的 iOS 10.3.1,修復了 iPhone 中博通 Wi-Fi 芯片的一個重大安全漏洞,該安全漏洞可能會使在 Wi-Fi 范圍內的攻擊者在智能手機上注入并運行代碼。 Google Project…

計算機開機跳過硬盤檢查,如何設置開機跳過檢測硬盤

如何設置開機跳過檢測硬盤導讀:很多win用戶都想設置開機跳過檢測硬盤,能夠更加快速的進入系統,今天百分網小編給大家整理出了方法。1、系統的問題系統解決在Windows界面下,通過“磁盤碎片整理”程序來完成。首先啟動“CMD”鍵入“…

CLIENT系列、OFFSET系列、SCROLL系列

一、client系列 clientWidth/clientHeight 是我們設置的寬和高加上內邊距(沒有邊框) clientLeft/clientTop  就是我們設置的邊框值 二、offset系列 offsetWidth/offsetHeight  是我們設置的寬和高加上內邊距,加上邊框 offsetLeft/offs…

臺積電放大招:甩開英特爾 7nm和5nm芯片將誕生

北京時間1月20日消息,據科技網站AppleInsider報道,近幾年來臺積電的發展勢頭相當猛,該公司總裁兼聯合CEO劉德音(Mark Liu)在最近的投資者會議中表示,預計今年年末公司就將正式量產10nm晶圓。此外,臺積電7nm研發一如預期…

01: 實現注冊登錄功能

目錄:抽屜項目之js最佳實踐 01: 實現注冊登錄功能 02: 實現發布帖子功能 03: 將帖子展示到頁面、點贊 04: 層級評論 目錄: 1.1 顯示、隱藏 "登錄/注冊" 菜單1.2 注冊功能1.3 登錄功能1.4 獲取當前用戶數量1.1 顯示、隱藏 "登錄/注冊"…

計算機系統怎么算頁面大小,電腦網頁的設計尺寸是多少

電腦網頁的設計尺寸是多少剛入門的網頁設計師可能對電腦網頁的設計尺寸大小存在疑問,以下百分網小編整理的電腦網頁的設計尺寸,希歡迎閱讀!  對大于30W臺客戶端用戶進行測試,得到的測試數據如下(數據來源于網絡):安全分辨率為10…

Array 的一些常用 API

unshift、push、shift、pop 這4個方法都會改變原數組unshift() 從前面添加元素,push() 從后面追加元素,返回數組長度shift() 刪除第0個元素,pop() 刪除最后一個元素,返回被刪除的元素slice 不改變原數組slice(m, n)返回原數組索引…

Ovum觀察:運營商通信PaaS發展趨勢強勁

近日在佛羅里達州奧蘭多市舉行的Genband公司Perspectives16會議上,一個首要議題是在通信領域應對OTT威脅。 這場會議的主旨側重于電信運營商和其他服務提供商如何應對日益嚴重的威脅,不過似乎這樣的討論有些晚了,因為許多大型運營商已經找到了…

WPF 托盤閃爍

WPF 托盤閃爍控件名:NotifyIcon作者:WPFDevelopersOrg - 弈虎、驚鏵原文鏈接: https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40。Visual Studio 2022。項目使用 MIT 開源許可協議。接著上一篇基礎托盤。新增如下…

電機與系統計算機仿真作業,北郵計算機仿真期末大作業.docx

文檔介紹:EvaluationWarning:ThedocumentwascreatedwithSpire..I瑋涼爰p電大摩《計算機仿真》MATLAB課程設計報告學院: 自動化學院 專業: 自動化專業 班級: 2010211411姓名: 韓思宇 學號: 10212006 2013年01月14日轉子繞線機控制系統綜合仿真摘要:轉子繞線機的控制系…

Software License Manager

slmgr -ilc lenovo.xrm-ms slmgr -ipk lenovo-lenovo-lenovo-lenovo-lenovo轉載于:https://www.cnblogs.com/cuthead/p/license.html

Sqlserver數據庫還原一直顯示“正在還原…”解決方法

今天在Sqlerver還原數據庫時一直就卡在那里提示“正在還原…”的狀態,此時無法操作數據庫,下面我來給大家介紹解決些問題的方法解決方法: 代碼如下復制代碼 RESTORE DATABASE demo FROM DISK D:/demo.bak WITH MOVE demo TO d:/demo.mdf, MOVE dem…

Information Retrieval 倒排索引 學習筆記

一,問題描述 在Shakespeare文集(有很多文檔Document)中,尋找哪個文檔包含了單詞“Brutus”和"Caesar",且不包含"Calpurnia"。這其實是一個查詢操作(Boolean Queries)。 在U…

計算機地址欄搜索不了網,我的電腦地址欄不見了怎么辦 地址欄不見了如何解決...

導語:小編對電腦是比較癡迷的,因此喜歡在自己的電腦上進行各種操作,也經常會碰到一些問題。今天要為大家介紹的是在我的電腦地址欄不見了之后怎么辦,熟悉電腦的朋友都能夠了解。在我的電腦主界面里面,有一個地址欄&…

實踐App內存優化:如何有序地做內存分析與優化

由于項目里之前線上版本出現過一定比例的OOM,雖然比例并不大,但是還是暴露了一定的問題,所以打算對我們App分為幾個步驟進行內存分析和優化,當然內存的優化是個長期的過程,不是一兩個版本的事,每個版本都需要收集線上內…

php OpenSSL 加解密

2018-1-6 17:10:19 星期六 1 $data 123456;2 $openssl_method AES-256-CBC;3 $openssl_iv_length openssl_cipher_iv_length($openssl_method);4 $openssl_iv openssl_random_pseudo_bytes($openssl_iv_length);5 $openssl_password openssl_random_pseudo_bytes(16);6 7 …

前端應該掌握的網絡知識(1)

1、客戶端:通過發送請求獲取服務器資源的web瀏覽器等。 2、TCP/IP協議族按層次分為:應用層、傳輸層、網絡層和數據鏈路層。 應用層決定了向用戶提供應用服務時通信的活動。比如:FTP(文本傳輸協議)和DNS(域名…