亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

深入講解我們說的CAS自旋鎖到底是什么

2024-07-14 08:40:58
字體:
來源:轉載
供稿:網友

什么是java/293400.html">自旋鎖

說道自旋鎖就要從多線程下的鎖機制說起,由于在多處理器系統環境中有些資源因為其有限性,有時需要互斥訪問(mutual exclusion),這時會引入鎖的機制,只有獲取了鎖的進程才能獲取資源訪問。即每次只能有且只有一個進程能獲取鎖,才能進入自己的臨界區,同一時間不能兩個或兩個以上進程進入臨界區,當退出臨界區時釋放鎖。

設計互斥算法時總是會面臨一種情況,即沒有獲得鎖的進程怎么辦?

通常有2種處理方式:

一種是沒有獲得鎖的調用者就一直循環在那里看是否該自旋鎖的保持者已經釋放了鎖,這就是本文的重點——自旋鎖。他不用將線城阻塞起來(NON-BLOCKING)。

另一種是沒有獲得鎖的進程就阻塞(BLOCKING)自己,繼續執行線程上的其他任務,這就是 ——互斥鎖(包括內置鎖Synchronized還有ReentrantLock等等)。

引言

CAS(Compare and swap),即比較并交換,也是實現我們平時所說的自旋鎖或樂觀鎖的核心操作。

它的實現很簡單,就是用一個預期的值和內存值進行比較,如果兩個值相等,就用預期的值替換內存值,并返回 true。否則,返回 false。

保證原子操作

任何技術的出現都是為了解決某些特定的問題, CAS 要解決的問題就是保證原子操作。原子操作是什么,原子就是最小不可拆分的,原子操作就是最小不可拆分的操作,也就是說操作一旦開始,就不能被打斷,知道操作完成。在多線程環境下,原子操作是保證線程安全的重要手段。舉個例子來說,假設有兩個線程在工作,都想對某個值做修改,就拿自增操作來說吧,要對一個整數 i 進行自增操作,需要基本的三個步驟:

1、讀取 i 的當前值;

2、對 i 值進行加 1 操作;

3、將 i 值寫回內存;

假設兩個進程都讀取了 i 的當前值,假設是 0,這時候 A 線程對 i 加 1 了,B 線程也 加 1,最后 i 的是 1 ,而不是 2。這就是因為自增操作不是原子操作,分成的這三個步驟可以被干擾。如下面這個例子,10個線程,每個線程都執行 10000 次 i++ 操作,我們期望的值是 100,000,但是很遺憾,結果總是小于 100,000 的。

 static int i = 0; public static void add(){ i++; }  private static class Plus implements Runnable{ @Override public void run(){ for(int k = 0;k<10000;k++){ add(); } } }  public static void main(String[] args) throws InterruptedException{ Thread[] threads = new Thread[10]; for(int i = 0;i<10;i++){ threads[i] = new Thread(new Plus()); threads[i].start(); } for(int i = 0;i<10;i++){ threads[i].join(); } System.out.println(i); }

既然這樣,那怎么辦。沒錯,也許你已經想到了,可以加鎖或者利用 synchronized 實現,例如,將 add() 方法修改為如下這樣:

public synchronized static void add(){ i++; }

或者,加鎖操作,例如下面使用 ReentrantLock (可重入鎖)實現。

private static Lock lock = new ReentrantLock(); public static void add(){ lock.lock(); i++; lock.unlock(); }

CAS 實現自旋鎖

既然用鎖或 synchronized 關鍵字可以實現原子操作,那么為什么還要用 CAS 呢,因為加鎖或使用 synchronized 關鍵字帶來的性能損耗較大,而用 CAS 可以實現樂觀鎖,它實際上是直接利用了 CPU 層面的指令,所以性能很高。

上面也說了,CAS 是實現自旋鎖的基礎,CAS 利用 CPU 指令保證了操作的原子性,以達到鎖的效果,至于自旋呢,看字面意思也很明白,自己旋轉,翻譯成人話就是循環,一般是用一個無限循環實現。這樣一來,一個無限循環中,執行一個 CAS 操作,當操作成功,返回 true 時,循環結束;當返回 false 時,接著執行循環,繼續嘗試 CAS 操作,直到返回 true。

其實 JDK 中有好多地方用到了 CAS ,尤其是java.util.concurrent包下,比如 CountDownLatch、Semaphore、ReentrantLock 中,再比如 java.util.concurrent.atomic 包下,相信大家都用到過 Atomic* ,比如 AtomicBoolean、AtomicInteger 等。

這里拿 AtomicBoolean 來舉個例子,因為它足夠簡單。

public class AtomicBoolean implements java.io.Serializable { private static final long serialVersionUID = 4654671469794556979L; // setup to use Unsafe.compareAndSwapInt for updates private static final Unsafe unsafe = Unsafe.getUnsafe(); private static final long valueOffset; static { try { valueOffset = unsafe.objectFieldOffset (AtomicBoolean.class.getDeclaredField("value")); } catch (Exception ex) { throw new Error(ex); } } private volatile int value;  public final boolean get() { return value != 0; } public final boolean compareAndSet(boolean expect, boolean update) { int e = expect ? 1 : 0; int u = update ? 1 : 0; return unsafe.compareAndSwapInt(this, valueOffset, e, u); }}

這是 AtomicBoolean 的部分代碼,我們看到這里面又幾個關鍵方法和屬性。

1、使用了 sun.misc.Unsafe 對象,這個類提供了一系列直接操作內存對象的方法,只是在 jdk 內部使用,不建議開發者使用;

2、value 表示實際值,可以看到 get 方法實際是根據 value 是否等于0來判斷布爾值的,這里的 value 定義為 volatile,因為 volatile 可以保證內存可見性,也就是 value 值只要發生變化,其他線程是馬上可以看到變化后的值的;下一篇會講一下 volatile 可見性問題,歡迎關注

3、valueOffset 是 value 值的內存偏移量,用 unsafe.objectFieldOffset 方法獲得,用作后面的 compareAndSet 方法;

4、compareAndSet 方法,這就是實現 CAS 的核心方法了,在使用 AtomicBoolean 的這個方法時,只需要傳遞期望值和待更新的值即可,而它里面調用了 unsafe.compareAndSwapInt(this, valueOffset, e, u) 方法,它是個 native 方法,用 c++ 實現,具體的代碼就不貼了,總之是利用了 CPU 的 cmpxchg 指令完成比較并替換,當然根據具體的系統版本不同,實現起來也有所區別,感興趣的可以自行搜一下相關文章。

使用場景

  • CAS 適合簡單對象的操作,比如布爾值、整型值等;
  • CAS 適合沖突較少的情況,如果太多線程在同時自旋,那么長時間循環會導致 CPU 開銷很大;

比如 AtomicBoolean 可以用在這樣一個場景下,系統需要根據一個布爾變量的狀態屬性來判斷是否需要執行一些初始化操作,如果是多線程的環境下,避免多次重復執行,可以使用 AtomicBoolean 來實現,偽代碼如下:

private final static AtomicBoolean flag = new AtomicBoolean(); if(flag.compareAndSet(false,true)){ init(); }

比如 AtomicInteger 可以用在計數器中,多線程環境中,保證計數準確。

ABA問題

CAS 存在一個問題,就是一個值從 A 變為 B ,又從 B 變回了 A,這種情況下,CAS 會認為值沒有發生過變化,但實際上是有變化的。對此,并發包下倒是有 AtomicStampedReference 提供了根據版本號判斷的實現,可以解決一部分問題。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲无亚洲人成网站77777| 中文字幕精品www乱入免费视频| 77777少妇光屁股久久一区| 日韩中文字幕在线视频播放| 欧美极品少妇与黑人| 日韩精品丝袜在线| 日韩成人av在线播放| 欧美日韩国产麻豆| 国产91精品黑色丝袜高跟鞋| 日韩毛片在线观看| 欧美激情一级精品国产| 国产欧美日韩精品专区| 亚洲精品电影在线| 欧美日本中文字幕| 91最新在线免费观看| 久久精品在线视频| 久久综合色88| 国产一区二区av| 亚洲成人在线视频播放| 日本成人黄色片| 国产精品久久久久99| 欧美理论电影网| 国产一区二区在线免费| 在线性视频日韩欧美| 欧美在线观看日本一区| 久久久久久久久综合| 国产亚洲精品美女久久久久| 色综合久久中文字幕综合网小说| 色青青草原桃花久久综合| 国产精品免费一区| 欧洲午夜精品久久久| 伊人久久精品视频| 亚洲电影免费观看高清完整版| 亚洲国产精品va在线看黑人动漫| 亚洲精品国产精品自产a区红杏吧| 欧美日韩一区二区在线| 久久久久在线观看| 国产精品第8页| 日韩国产激情在线| 亚洲欧美激情另类校园| 精品久久香蕉国产线看观看亚洲| 92裸体在线视频网站| 中文字幕av一区中文字幕天堂| 日韩av在线天堂网| 国产精品2018| 欧美一级在线播放| 国产精品永久免费在线| 91精品国产乱码久久久久久蜜臀| 国产视频一区在线| 亚洲一区美女视频在线观看免费| 日韩在线观看免费全| 日本a级片电影一区二区| 久久香蕉国产线看观看av| 亚洲a∨日韩av高清在线观看| 国产成人精品午夜| 中文字幕久热精品视频在线| 国产日韩亚洲欧美| 久久国产精彩视频| 97香蕉久久超级碰碰高清版| 影音先锋欧美在线资源| 俺去啦;欧美日韩| 国产成人在线精品| 55夜色66夜色国产精品视频| 亚洲成av人影院在线观看| 久久亚洲综合国产精品99麻豆精品福利| 国产成人综合久久| 国内久久久精品| 欧美成人精品激情在线观看| 中文字幕亚洲一区二区三区五十路| 亚洲自拍另类欧美丝袜| 久久久av亚洲男天堂| 亚洲欧美日韩精品久久| 国产精品露脸自拍| 青青久久av北条麻妃黑人| 国产精品美女无圣光视频| 欧美www在线| 免费99精品国产自在在线| 在线成人中文字幕| 性欧美xxxx| …久久精品99久久香蕉国产| 日韩av高清不卡| 中文字幕精品—区二区| 亚洲精品视频在线观看视频| 欧美xxxx14xxxxx性爽| 热久久这里只有精品| 久久全球大尺度高清视频| 欧美激情一二区| 亚洲国产婷婷香蕉久久久久久| 国产91色在线|免| 一个色综合导航| 最近中文字幕2019免费| 久久亚洲精品小早川怜子66| 亚洲free嫩bbb| 成人午夜在线观看| 色无极影院亚洲| 韩国三级电影久久久久久| 欧美日韩黄色大片| 91大神福利视频在线| 国产免费一区二区三区在线能观看| 一区二区三区视频免费在线观看| 国产成人亚洲精品| 日韩有码视频在线| 欧美午夜激情小视频| 中文字幕亚洲欧美| 国产精品久久久久久五月尺| 国产网站欧美日韩免费精品在线观看| 中文字幕九色91在线| 成人激情黄色网| 亚洲精品在线91| 亚洲欧美激情精品一区二区| 26uuu另类亚洲欧美日本老年| 亚洲欧美国产精品| 国产精品久久久久久久午夜| 日韩中文字幕国产| 亚洲欧美中文日韩v在线观看| 少妇高潮 亚洲精品| 动漫精品一区二区| 国产精品久久久久秋霞鲁丝| 欧美精品在线网站| 国产一区二区在线免费| 国产成人久久精品| 国产精品一二区| 国产精品第七影院| 亚洲国产日韩欧美在线图片| 欧美亚洲第一区| 精品久久久久久亚洲精品| 精品亚洲国产视频| 国产视频久久久久| 一区二区三区四区精品| 在线观看欧美视频| 红桃av永久久久| 亚洲成**性毛茸茸| 91精品久久久久久久久久另类| 日韩欧美aⅴ综合网站发布| 正在播放欧美一区| 国产精品嫩草视频| 91麻豆桃色免费看| 亚洲男人7777| 国产一区二区视频在线观看| 成人午夜小视频| 国产精品欧美亚洲777777| 精品高清一区二区三区| 国产女人18毛片水18精品| 色青青草原桃花久久综合| 成人免费在线视频网址| 欧美在线亚洲在线| 国产视频精品xxxx| 色综合久久久888| 欧美黑人xxx| 欧美精品午夜视频| 亚洲欧美日韩在线高清直播| 精品久久久久久久大神国产| 日韩av免费看| 成人网在线观看| 国产精品色悠悠| 亚洲久久久久久久久久久| 国产美女扒开尿口久久久| 亚洲欧美三级伦理| 深夜福利日韩在线看| 成人精品一区二区三区| 欧美专区在线观看| 欧美电影免费观看电视剧大全| 欧美激情视频在线| 国产精品福利无圣光在线一区|