本篇文章為大家帶來了關於java的相關問題,其中主要介紹了關於CAS的相關問題,CAS(compare and swap),比較並交換,可以解決多線程並行情況下使用鎖造成性能損耗的機制,希望對大家有幫助。
推薦學習:《java教學》
CAS(compare and swap),比較並交換。可以解決多執行緒並行情況下使用鎖造成效能損耗的一種機制.CAS 運算包含三個運算元—記憶體位置(V)、預期原值(A)和新值(B)。如果記憶體位置的值與預期原值相匹配,那麼處理器會自動將該位置值更新為新值。否則,處理器不做任何操作。一個執行緒從主記憶體得到num值,並對num進行操作,寫入值的時候,執行緒會把第一次取到的num值和主記憶體中num值進行比較,如果相等,就會改變後的num寫入主內存,如果不相等,則一直循環對比,知道成功為止。
在修飾共享變數的時候經常使用volatile關鍵字,但是volatile值有可見性和禁止指令重拍(有序性),無法保證原子性。雖然在單線程中沒有問題,但是多線程就會出現各種問題,造成現場不安全的現象。所以jdk1.5後產生了CAS利用CPU原語(不可分割,連續不中斷)保證現場操作原子性。
在JDK1.5 中新增java.util.concurrent(JUC)就是建立在CAS之上的。相對於synchronized這種鎖定機制,CAS是非阻塞演算法的常見實作。所以JUC在性能上有了很大的提升。
例如AtomicInteger類,AtomicInteger是執行緒安全的,下面是原始碼
##進入unsafe看到#do while自循環,這裡的自循環,就是在 判斷預期原值 如果與原來的值不符合,會再循環取原值,再走CAS流程,直到能夠把新值賦值成功。
CAS優點cas是一種樂觀鎖的思想,而且是一種非阻塞的輕量級的樂觀鎖,非阻塞式是指一個執行緒的失敗或者掛起不應該影響其他執行緒的失敗或掛起的演算法。 CAS 缺點從Java1.5開始JDK的atomic包裡提供了一個類別AtomicStampedReference來解決ABA問題。這個類別的compareAndSet方法作用是先檢查當前引用是否等於預期引用,並且當前標誌是否等於預期標誌,如 全部相等,則以原子方式將該引用和該標誌的值設為給定的更新值。
#推薦學習:《java學習教學》
以上是深入了解java之CAS詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!