(Java學習筆記)CAS機制
阿新 • • 發佈:2018-12-13
文章是學習筆記,如果有誤,請各位指出 環境:JDK8 WIN10 64位
一.什麼是CAS機制 CAS機制的全名叫做compare and swap 讓我們來看一行程式碼
public final native boolean compareAndSwapLong(Object var1, long var2, long var4, long var6);
這行程式碼源於Unsafe類(待補充),引數var1和var2我們先不考慮,var4表示舊值,var6表示新值,這行程式碼的作用是,如果var4的值等於記憶體中的現有值,那麼將記憶體中的值替換為var6同時返回true,否則返回false。這就是CAS機制,同時也是其在Java中的體現
二.為什麼要使用CAS/有哪些好處 一般情況下,當我們併發訪問同一個int變數時,我們往往需要加鎖操作,但每次加鎖會造成大量的開銷,影響效能,所以就有了CAS機制,可以讓我們在不加鎖的情況下做到執行緒安全
三.CAS機制存在哪些問題 1.ABA問題 先看一段程式碼,程式碼源於Unsafe類 ①這一步的意義是得到記憶體中的現有值(引數可忽略)
public final long getAndAddLong(Object var1, long var2, long var4) { long var6; do { var6 = this.getLongVolatile(var1, var2);① } while(!this.compareAndSwapLong(var1, var2, var6, var6 + var4)); return var6; }
ABA問題簡述: 如程式碼所示,假設存線上程1,2。執行緒1運行了①之後等待,執行緒2開始執行,執行緒2將A改變為B,再將B改變為A,執行緒2結束,執行緒1繼續執行,此時,執行緒1會認為A依舊是原來他讀取到的A,期間並沒有改變,並且將他按照正常流程改變為B。 當然,在變數加減方面這並不會造成什麼影響,但是若將CAS用在堆疊或者連結串列上(網上搜索一下有很多這種ABA問題的例子),那麼就會出現嚴重的問題
2.在極高併發情況下,CAS的失敗率將增大,會導致嚴重的效能問題