日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java中的CAS操作

發布時間:2024/3/24 java 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的CAS操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java中的CAS的含義

CAS即是Compare and Swap ,它是JDK提供的非阻塞原子性操作,它通過硬件保證了比較一更新操作的原子性。CAS 操作包含三個操作數—內存位置(V)、預期原值(A)和新值(B)。如果內存位置的值與預期原值相匹配,那么處理器會自動將該位置值更新為新值。否則,處理器不做任何操作。一個線程從主內存中得到num值,并對num進行操作,寫入值的時候,線程會把第一次取到的num值和主內存中num值進行比較,如果相等,就會將改變后的num寫入主內存,如果不相等,則一直循環對比,知道成功為止。

CAS和Synchronized和volatile的對比:

由于在Java中,鎖在并發處理中占據了一席之地,但是使用Synchronized加鎖有一個不好的地方,就是當一個線程沒有獲取到鎖時會被阻塞掛起,這會導致線程上下文的切換和重新調度開銷。此時java提供了非阻塞的volatile關鍵字來解決共享變量的可見性問題,在一定的程度上彌補了鎖帶來的開銷問題,但是volatile只能保證共享變量的可見性,不能解決讀改寫等的原子性問題,這個時候java提供了CAS。

CAS操作的經典問題

1.ABA問題: 例如:假如線程1使用了CAS修改了初始值為A的變量X,那么線程1首先會去獲取變量X的值A,然后使用CAS操作嘗試修改X的值為B,看似CAS操作成功了,但是在多線程情況下,其實未必,可能線程2在線程1獲取變量X的值后,CAS操作之前,使用了CAS修改了變量X的值為B,然后再次CAS操作修改變量X的值為A。此時線程1再去執行CAS操作時,雖然變量X的值為A,但是已經不是最初的那個A了。這就是ABA問題。
2.循環時間長開銷大 ,持續占用cpu資源的問題: 雖然看似CAS把一些操作變成了一條CPU指令就能完成的原子操作,但是由于它是基于自旋鎖純用戶態環境)實現的,當一個線程再獲取鎖時,如果發現鎖被其他線程占有,它并不會馬上阻塞自己,而是不放棄CPU使用權的情況下,多次嘗試獲取鎖。這就會導致CPU資源被長時間的占有。
3.只能保證一個變量的原子性操作的問題: 多個變量的原子操作我們用synchronized加鎖,如果針對一個變量我們可以使用CAS減小加鎖的開銷和線程阻塞等待以及重新調度的開銷。

CAS的應用場合

1.線程數較少,等待時間短可以采用自旋鎖進行CAS嘗試獲取鎖,這樣比Synchronized高效。
2.線程數較大,等待時間長,不建議使用自旋鎖,占用CPU較高。

總結

以上是生活随笔為你收集整理的Java中的CAS操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。