CAS
Compare And Swap.比較并交換.java中的同步器就是基于CAS技術(shù)實(shí)現(xiàn)的,為什么它能保證操作的同步性呢?因?yàn)槭窃硬僮鞯囊环N,所以可以在多線程環(huán)境下來實(shí)現(xiàn)數(shù)據(jù)的交換操作不被打斷.
CAS的缺陷
ABA問題:
第一個(gè)線程來讀取變量A時(shí)被掛起;第二個(gè)線程過來操作A,將A賦值為B之后,并重新賦值為A;線程二完成操作;此時(shí),對(duì)于線程一來說,所看到變量A的值是沒有變化的,但是實(shí)際上變量A已經(jīng)修改了兩次.
上述情況還不是最壞情況.如果在一個(gè)隊(duì)列中,有三個(gè)指針元素分別順序的指向了三個(gè)內(nèi)存地址.進(jìn)行.當(dāng)?shù)谝粋€(gè)線程操作第一個(gè)位置的指針元素時(shí),線程被掛起.線程二過來進(jìn)行了一大堆的pop和push操作,這時(shí)第一個(gè)位置的指針元素的數(shù)據(jù).
CAS下ABA問題及優(yōu)化方案
CAS的優(yōu)點(diǎn)
它比鎖快.
Disruptor論文中講述了一個(gè)實(shí)驗(yàn):
這個(gè)測(cè)試程序調(diào)用了一個(gè)函數(shù),該函數(shù)會(huì)對(duì)一個(gè)64位的計(jì)數(shù)器循環(huán)自增5億次。
機(jī)器環(huán)境:2.4G 6核
運(yùn)算: 64位的計(jì)數(shù)器累加5億次
Method Time (ms) Single thread 300 Single thread with CAS 5,700 Single thread with lock 10,000 Single thread with volatile write 4,700 Two threads with CAS 30,000 Two threads with lock 224,000
所以,鎖的性能相對(duì)于CAS操作更加低.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/70465.html
摘要:上一篇文章簡單介紹了在本地開發(fā)環(huán)境中搭建服務(wù)端和客戶端,對(duì)單點(diǎn)登錄過程有了一個(gè)直觀的認(rèn)識(shí)之后,本篇將探討單點(diǎn)登錄的實(shí)現(xiàn)原理。因此引入服務(wù)端作為用戶信息鑒別和傳遞中介,達(dá)到單點(diǎn)登錄的效果。為該流程的實(shí)現(xiàn)類。表示對(duì)返回結(jié)果的處理。 上一篇文章簡單介紹了 CAS 5.2.2 在本地開發(fā)環(huán)境中搭建服務(wù)端和客戶端,對(duì)單點(diǎn)登錄過程有了一個(gè)直觀的認(rèn)識(shí)之后,本篇將探討 CAS 單點(diǎn)登錄的實(shí)現(xiàn)原理。 一...
摘要:最終依舊使用來更新值。此時(shí)使用能更好地提升性能。適用于高并發(fā)情況下的計(jì)數(shù)操作,利用與相似的原理,以空間換時(shí)間,提高了實(shí)際的計(jì)數(shù)效率。 AtomicLong /** * Atomically increments by one the current value. * * @return the updated value */ public final long increme...
摘要:是大學(xué)發(fā)起的一個(gè)企業(yè)級(jí)的開源的項(xiàng)目,旨在為應(yīng)用系統(tǒng)提供一種可靠的單點(diǎn)登錄解決方法屬于。實(shí)現(xiàn)原理是先通過的認(rèn)證,然后向申請(qǐng)一個(gè)針對(duì)于的,之后在訪問時(shí)把申請(qǐng)到的針對(duì)于的以參數(shù)傳遞過去。后面的流程與上述流程步驟及以后步驟類似 CAS( Central Authentication Service )是 Yale 大學(xué)發(fā)起的一個(gè)企業(yè)級(jí)的、開源的項(xiàng)目,旨在為 Web 應(yīng)用系統(tǒng)提供一種可靠的單點(diǎn)登...
摘要:獲取資源失敗,將該線程加入等待隊(duì)列尾部,標(biāo)記為獨(dú)占模式。如果有剩余資源則會(huì)喚醒下一個(gè)線程,且整個(gè)過程忽略中斷的影響。 AQS概念及定義 ASQ:AbstractQueuedSynchronizer 它維護(hù)了一個(gè)volatile int state(代表共享資源)和一個(gè)FIFO線程等待隊(duì)列(多線程爭(zhēng)用資源被阻塞時(shí)會(huì)進(jìn)入此隊(duì)列,有個(gè)內(nèi)部類Node定義了節(jié)點(diǎn)。隊(duì)列由AQS的volatile成...
摘要:有了這個(gè)基礎(chǔ),才能發(fā)揮作用,使得在節(jié)點(diǎn)取消和異常時(shí)能夠保證隊(duì)列在多線程下的完整性。 Doug Lea是JDK中concurrent工具包的作者,這位大神是誰可以自行g(shù)oogle。 本文淺析ReentrantLock(可重入鎖)的原理 Lock接口 showImg(https://segmentfault.com/img/bV2671?w=276&h=176); Lock接口定義了這幾個(gè)...
閱讀 2283·2021-09-07 09:58
閱讀 3472·2019-08-30 14:07
閱讀 1352·2019-08-29 12:32
閱讀 722·2019-08-29 11:06
閱讀 3744·2019-08-26 18:18
閱讀 3807·2019-08-26 17:35
閱讀 1439·2019-08-26 11:35
閱讀 670·2019-08-26 11:35