java并发之CAS
生活随笔
收集整理的這篇文章主要介紹了
java并发之CAS
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 1:何為CAS
- 2:CAS圖示
- 3:CAS和Volatile的關系
- 4:為何CAS效率更高一些
- 5:CAS的特點
- 7:受保護得共享數據類型
- (1):原子基本數據類型
- (2):原子引用數據類型
- 7:ABA問題
- (1):什么是ABA
- (2):如何解決呢?
1:何為CAS
- CAS(Compare And Swap),即比較并交換。是解決多線程并行情況下使用鎖造成性能損耗的一種機制。
- CAS操作包含三個操作數——內存位置(V)、預期原值(A)和新值(B)。如果內存位置的值與預期原值相匹配,那么處理器會自動將該位置值更新為新值。否則,處理器不做任何操作。
- CAS有效地說明了“我認為位置V應該包含值A;如果包含該值,則將B放到這個位置;否則,不要更改該位置,只告訴我這個位置現在的值即可。
2:CAS圖示
- 我們對共享資源(balance)用 AtomicInteger修飾,調用其compareAndSet方法使每次更余額的時候,我們的余額都是最新值。
- 流程展示
解釋:圖示中的注釋中線程2對共享變量的操作發(fā)生在 線程1 中 (int next = prev - amount 和 if …之間)在這其中發(fā)生了上下文切換。
3:CAS和Volatile的關系
- 獲取共享變量時,需要用到volatile修飾變量,來保證變量的可見性;
- CAS必須借助volatile才能讀取到共享變量的最新值,來實現比較交換。
4:為何CAS效率更高一些
- 無鎖情況下,即使重試失敗,線程始終在高速運行,沒有停歇,而synchronized會讓線程在沒有獲得鎖的
時候,發(fā)生上下文切換,進入阻塞。打個比喻 - 線程就好像高速跑道上的賽車,高速運行時,速度超快,一旦發(fā)生上下文切換,就好比賽車要減速、熄
火,等被喚醒又得重新打火、啟動、加速.恢復到高速運行,代價比較大 - 但無鎖情況下,因為線程要保持運行,需要額外CPU的支持,CPU在這里就好比高速跑道,沒有額外的
跑道,線程想高速運行也無從談起,雖然不會進入阻塞,但由于沒有分到時間片,仍然會進入可阻塞狀
態(tài),還是會導致上下文切換。
5:CAS的特點
結合CAS和volatile可以實現無鎖并發(fā),適用于線程數少、多核CPU的場景下。
- CAS是基于樂觀鎖的思想:最樂觀的估計,不怕別的線程來修改共享變量,就算改了也沒關系,我吃虧
點再重試唄。 - synchronized是基于悲觀鎖的思想:最悲觀的估計,得防著其它線程來修改共享變量,我上了鎖你們都別
想改,我改完了解開鎖,你們才有機會。 - CAS體現的是== 無鎖并發(fā)、無阻塞并發(fā) == ,請仔細體會這兩句話的意思
- 因為沒有使用synchronized,所以線程不會陷入阻塞,這是效率提升的因素之一
- 但如果競凈激烈,可以想到重試必然頻繁發(fā)生,反而效率會受影響(這里的重試就是,pre值和內存值不一樣,CAS返回的結果false,那么的話我們再進行一次CAS操作)
7:受保護得共享數據類型
(1):原子基本數據類型
(2):原子引用數據類型
7:ABA問題
(1):什么是ABA
本來主線程從主存中獲取到的值是A,然后我們進行CAS中的比較也是和主存中的A進行比較,但是如果有線程在主線程CAS操作之前將A改為B,又將B改為A的話,那么主線程是感知不到的。
(2):如何解決呢?
如果主線程希望只要有其他線程動過了,共享變量的話,那么自己的CAS操作就算失敗,這時僅僅是比較值是不夠的,還要增加一個版本號,只要有人動過共享變量的話,那么版本號就會發(fā)生相應的變化,一旦主線程發(fā)現版本號不同的話,那么我們就CAS操作失敗
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java并发之CAS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Excel单元格内如何添加多条斜线并添加
- 下一篇: 八大排序算法之选择排序算法