大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 淺談多線程CAS

淺談多線程CAS

更新時間:2021-01-04 08:43:36 來源:動力節(jié)點(diǎn) 瀏覽1613次

CAS(compare and swap)是解決多線程并行情況下使用鎖造成性能損耗的一種機(jī)制。多線程CAS操作包含3個操作數(shù),分別是內(nèi)存位置V、預(yù)期原值A(chǔ)和新值B。如果內(nèi)存位置的值與預(yù)期原值相匹配,那么處理器會自動將該位置值更新為新值。否則,處理器不做任何操作。無論哪種情況,它都會在CAS指令之前返回該位置的值。多線程CAS有效地說明了“我認(rèn)為位置V應(yīng)該包含值A(chǔ);如果包含該值,則將B放到這個位置;否則,不要更改該位置,只告訴我這個位置現(xiàn)在的值即可。

 

這些處理過程有指令集的支持,因此看似讀-寫-改操作只是一個原子操作,所以不存在線程安全問題。我們看個cas的操作過程偽代碼:

                   

int value ;

int compareAndSwap (int oldValue,int newValue){

int old_reg_value =value ;

if (old_reg_value==old_reg_value)

value =newValue;

return old_reg_value ;

 }

                        

當(dāng)多個線程嘗試使用CAS同時更新同一個變量的時候,只有其中一個線程能夠更新變量的值。當(dāng)其他線程失敗后,不會像獲取鎖一樣被掛起,而是可以再次嘗試,或者不進(jìn)行任何操作,這種靈活性就大大減少了鎖活躍性風(fēng)險。

 

CAS的特性決定了CAS的功能和作用,我們知道采用鎖對共享數(shù)據(jù)進(jìn)行處理的話,當(dāng)多個線程競爭的時候,都需要進(jìn)行加鎖,沒有拿到鎖的線程會被阻塞,以及喚醒,這些都需要用戶態(tài)到核心態(tài)的轉(zhuǎn)換,這個代價對阻塞線程來說代價還是蠻高的,那cas是采用無鎖樂觀方式進(jìn)行競爭,性能上要比鎖更高些才是,為何不對鎖競爭方式進(jìn)行替換?

 

要回答這個問題,我們先舉個例子。當(dāng)你開車在上班高峰期的時候,如果通過交通信號燈來控制車流,可以實(shí)現(xiàn)更高的吞吐量,而環(huán)島雖然無紅綠燈讓你等待,但你一圈不一定能繞出你先出去的那個路口,有時候可能得多走幾圈,而在低擁堵的時候,環(huán)島則能實(shí)現(xiàn)更高的吞吐量,你一次就可以成功,而紅路燈反而效率低下了,即便人不多,你依然需要等待。

 

這個例子依然適應(yīng)鎖和cas的比較,在高度競爭的情況下,鎖的性能將超過cas的性能,但在中低程度的競爭情況下,cas性能將超過鎖的性能。多數(shù)情況下,資源競爭一般都不會那么激烈。

我們參考一個ConcurrentLinkedQueue 的源碼實(shí)現(xiàn),來看下cas的應(yīng)用。

ConcurrentLinkedQueue是一個基于鏈接節(jié)點(diǎn)的無界線程安全隊(duì)列,它是個單向鏈表,每個鏈接節(jié)點(diǎn)都擁有一個當(dāng)前節(jié)點(diǎn)的元素和下一個節(jié)點(diǎn)的指針。

 Node< E> {

volatile E item;

volatile Node< E> next;

}

它采用先進(jìn)先出的規(guī)則對節(jié)點(diǎn)進(jìn)行排序,當(dāng)我們添加一個元素的時候,它會添加到隊(duì)列的尾部(tail),當(dāng)我們獲取一個元素時,它會返回隊(duì)列頭部(head)的元素。tail節(jié)點(diǎn)和head節(jié)點(diǎn)方便我們快速定位最后一個和第一個元素。

             

在有兩次CAS操作的情況下,如何保證一致性呢?具體分為三種情況如下:

1、如果第一個cas更新成功,第二個失敗,那么對了tail會出現(xiàn)不一致的情況。而且即便是都更新成功了,在執(zhí)行兩個cas之間,仍然可能有另外一個線程會訪問這個隊(duì)列,那么如何保證這種多線程情況下不會出錯。

 

2、對于第一個問題,即便tail更新失敗,上述代碼也會循環(huán)的找到真正的尾節(jié)點(diǎn),在這里不是強(qiáng)制要求以tail為尾節(jié)點(diǎn),它只是一個靠近尾節(jié)點(diǎn)的指針。

 

3、第二種情況,如果線程B抵達(dá)時候,發(fā)現(xiàn)線程A正在執(zhí)行更新,那么B線程會通過反復(fù)循環(huán)來檢查隊(duì)列的狀態(tài),直到A完成更新,B線程又拿到了nextNode最新信息,添加新的node,從而使兩個線程不會相互干擾。

 

講了那么多,還是離不開CAS解決多線程并行情況下使用鎖造成性能損耗的本質(zhì),萬變不離其宗,只要我們掌握了這一點(diǎn)學(xué)起多線程CAS也就事半功倍了。在本站的多線程教程中還有更多的多線程的各種奇特的機(jī)制的詳細(xì)解析,幫助我們更好地學(xué)習(xí)多線程知識。

 


提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 亚洲欧美色综合一区二区在线 | 日韩在线一区视频 | 美女黄频视频大全免费高清 | 欧美超级碰碰 | 国产精品久久久久影院色 | 野外一级毛片 | 久婷婷| 亚洲曰本大成网站mmm | 精品无人区乱码一区二区三区手机 | sss欧美华人整片在线观看 | 亚洲一区二区三区精品影院 | 国产精品四虎在线观看免费 | 九九久久久久午夜精选 | 婷婷色在线视频 | 国产精品九九视频 | 狠狠的日视频 | 亚洲国产精品自产在线播放 | 精品久久久久久久久久久久久久久 | 老司机午夜网站 | 国产成人精品日本亚洲直接 | 精品福利在线视频 | 久久这里只有精品免费的 | 亚洲国产天堂久久精品网 | 久久免费视频在线观看30 | 国产精品久久久久久免费 | 视频播放在线观看精品视频 | 在线免费观看亚洲视频 | 日本最黄视频 | 精品中文字幕不卡在线视频 | 玖玖在线资源 | 国产成人成人一区二区 | 免费一级a毛片免费观看欧美大片 | 久久国产99| 亚州激情视频在线播放 | 人色在线视频 | 欧美亚洲国产一级毛片 | 成人在线视频观看 | 青草久久久 | 欧美成人爽毛片在线视频 | 欧美中文综合在线视频 | 99久久精品视香蕉蕉er热资源 |