日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

美團一面:什么是CAS?有什么優缺點?我說我知道AtomicInteger

來源: 責編: 時間:2024-04-22 09:16:12 262觀看
導讀引言傳統的并發控制手段,如使用synchronized關鍵字或者ReentrantLock等互斥鎖機制,雖然能夠有效防止資源的競爭沖突,但也可能帶來額外的性能開銷,如上下文切換、鎖競爭導致的線程阻塞等。而此時就出現了一種樂觀鎖的策略,

引言

傳統的并發控制手段,如使用synchronized關鍵字或者ReentrantLock等互斥鎖機制,雖然能夠有效防止資源的競爭沖突,但也可能帶來額外的性能開銷,如上下文切換、鎖競爭導致的線程阻塞等。而此時就出現了一種樂觀鎖的策略,以其非阻塞、輕量級的特點,在某些場合下能更好地提升并發性能,其中最為關鍵的技術便是Compare And Swap(簡稱CAS)。aKw28資訊網——每日最新資訊28at.com

CAS是一種無鎖算法,它在硬件級別提供了原子性的條件更新操作,允許線程在不加鎖的情況下實現對共享變量的修改。在Java中,CAS機制被廣泛應用于java.util.concurrent.atomic包下的原子類以及高級并發工具類如AbstractQueuedSynchronizer(AQS)的實現中。aKw28資訊網——每日最新資訊28at.com

CAS的基本概念與原理

CAS是一種原子指令,常用于多線程環境中的無鎖算法。CAS操作包含三個基本操作數:內存位置、期望值和新值。在執行CAS操作時,計算機會檢查內存位置當前是否存放著期望值,如果是,則將內存位置的值更新為新值;若不是,則不做任何修改,保持原有值不變,并返回當前內存位置的實際值。aKw28資訊網——每日最新資訊28at.com

在Java中,CAS機制被封裝在jdk.internal.misc.Unsafe類中,盡管這個類并不建議在普通應用程序中直接使用,但它是構建更高層次并發工具的基礎,例如java.util.concurrent.atomic包下的原子類如AtomicInteger、AtomicLong等。這些原子類通過JNI調用底層硬件提供的CAS指令,從而在Java層面上實現了無鎖并發操作。aKw28資訊網——每日最新資訊28at.com

這里指的注意的是,在JDK1.9之前CAS機制被封裝在sun.misc.Unsafe類中,在JDK1.9之后就使用了 jdk.internal.misc.Unsafe。這點由java.util.concurrent.atomic包下的原子類可以看出來。而sun.misc.Unsafe被許多第三方庫所使用。aKw28資訊網——每日最新資訊28at.com

CAS實現原理

在Java中,雖然Java語言本身并未直接提供CAS這樣的原子指令,但是Java可以通過JNI調用本地方法來利用硬件級別的原子指令實現CAS操作。在Java的標準庫中,特別是jdk.internal.misc.Unsafe類提供了一系列compareAndSwapXXX方法,這些方法底層確實是通過C++編寫的內聯匯編來調用對應CPU架構的cmpxchg指令,從而實現原子性的比較和交換操作。aKw28資訊網——每日最新資訊28at.com

cmpxchg指令是多數現代CPU支持的原子指令,它能在多線程環境下確保一次比較和交換操作的原子性,有效解決了多線程環境下數據競爭的問題,避免了數據不一致的情況。例如,在更新一個共享變量時,如果期望值與當前值相匹配,則原子性地更新為新值,否則不進行更新操作,這樣就能在無鎖的情況下實現對共享資源的安全訪問。 我們以java.util.concurrent.atomic包下的AtomicInteger為例,分析其compareAndSet方法。aKw28資訊網——每日最新資訊28at.com

public class AtomicInteger extends Number implements java.io.Serializable {    private static final long serialVersionUID = 6214790243416807050L;    //由這里可以看出來,依賴jdk.internal.misc.Unsafe實現的    private static final jdk.internal.misc.Unsafe U = jdk.internal.misc.Unsafe.getUnsafe();    private static final long VALUE = U.objectFieldOffset(AtomicInteger.class, "value");    private volatile int value;    public final boolean compareAndSet(int expectedValue, int newValue) {         // 調用 jdk.internal.misc.Unsafe的compareAndSetInt方法        return U.compareAndSetInt(this, VALUE, expectedValue, newValue);      }}

Unsafe中的compareAndSetInt使用了@HotSpotIntrinsicCandidate注解修飾,@HotSpotIntrinsicCandidate注解是Java HotSpot虛擬機(JVM)的一個特性注解,它表明標注的方法有可能會被HotSpot JVM識別為“內聯候選”,當JVM發現有方法被標記為內聯候選時,會嘗試利用底層硬件提供的原子指令(比如cmpxchg指令)直接替換掉原本的Java方法調用,從而在運行時獲得更好的性能。aKw28資訊網——每日最新資訊28at.com

public final class Unsafe {    @HotSpotIntrinsicCandidate      public final native boolean compareAndSetInt(Object o, long offset,                                                   int expected,                                                   int x);}

compareAndSetInt這個方法我們可以從openjdk的hotspot源碼(位置:hotspot/src/share/vm/prims/unsafe.cpp)中可以找到:aKw28資訊網——每日最新資訊28at.com

{CC "compareAndSetObject",CC "(" OBJ "J" OBJ "" OBJ ")Z", FN_PTR(Unsafe_CompareAndSetObject)},{CC "compareAndSetInt", CC "(" OBJ "J""I""I"")Z", FN_PTR(Unsafe_CompareAndSetInt)},{CC "compareAndSetLong", CC "(" OBJ "J""J""J"")Z", FN_PTR(Unsafe_CompareAndSetLong)},{CC "compareAndExchangeObject", CC "(" OBJ "J" OBJ "" OBJ ")" OBJ, FN_PTR(Unsafe_CompareAndExchangeObject)},{CC "compareAndExchangeInt", CC "(" OBJ "J""I""I"")I", FN_PTR(Unsafe_CompareAndExchangeInt)},{CC "compareAndExchangeLong", CC "(" OBJ "J""J""J"")J", FN_PTR(Unsafe_CompareAndExchangeLong)},

關于openjdk的源碼,本文源碼版本為1.9,如需要該版本源碼或者其他版本下載方法,請關注本公眾號【碼農Academy】后,后臺回復【openjdk】獲取aKw28資訊網——每日最新資訊28at.com

而hostspot中的Unsafe_CompareAndSetInt函數會統一調用Atomic的cmpxchg函數:aKw28資訊網——每日最新資訊28at.com

UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSetInt(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jint e, jint x)) {oop p = JNIHandles::resolve(obj);jint* addr = (jint *)index_oop_from_field_offset_long(p, offset);// 統一調用Atomic的cmpxchg函數return (jint)(Atomic::cmpxchg(x, addr, e)) == e;} UNSAFE_END

而Atomic的cmpxchg函數源碼(位置:hotspot/src/share/vm/runtime/atomic.hpp)如下:aKw28資訊網——每日最新資訊28at.com

/***這是按字節大小進行的`cmpxchg`操作的默認實現。它使用按整數大小進行的`cmpxchg`來模擬按字節大小進行的`cmpxchg`。不同的平臺可以通過定義自己的內聯定義以及定義`VM_HAS_SPECIALIZED_CMPXCHG_BYTE`來覆蓋這個默認實現。這將導致使用特定于平臺的實現而不是默認實現。*  exchange_value:要交換的新值。*  dest:指向目標字節的指針。*  compare_value:要比較的值。*  order:內存順序。*/inline jbyte Atomic::cmpxchg(jbyte exchange_value, volatile jbyte* dest,                             jbyte compare_value, cmpxchg_memory_order order) {  STATIC_ASSERT(sizeof(jbyte) == 1);  volatile jint* dest_int =      static_cast<volatile jint*>(align_ptr_down(dest, sizeof(jint)));  size_t offset = pointer_delta(dest, dest_int, 1);  // 獲取當前整數大小的值,并將其轉換為字節數組。  jint cur = *dest_int;  jbyte* cur_as_bytes = reinterpret_cast<jbyte*>(&cur);  // 設置當前整數中對應字節的值為compare_value。這確保了如果初始的整數值不是我們要找的值,那么第一次的cmpxchg操作會失敗。  cur_as_bytes[offset] = compare_value;  // 在循環中,不斷嘗試更新目標字節的值。  do {    // new_val    jint new_value = cur;    // 復制當前整數值,并設置其中對應字節的值為exchange_value。    reinterpret_cast<jbyte*>(&new_value)[offset] = exchange_value;    // 嘗試使用新的整數值替換目標整數。    jint res = cmpxchg(new_value, dest_int, cur, order);    if (res == cur) break; // 如果返回值與原始整數值相同,說明操作成功。    // 更新當前整數值為cmpxchg操作的結果。    cur = res;    // 如果目標字節的值仍然是我們之前設置的值,那么繼續循環并再次嘗試。  } while (cur_as_bytes[offset] == compare_value);  // 返回更新后的字節值  return cur_as_bytes[offset];}

而由cmpxchg函數中的do...while我們也可以看出,當多個線程同時嘗試更新同一內存位置,且它們的期望值相同但只有一個線程能夠成功更新時,其他線程的CAS操作會失敗。對于失敗的線程,常見的做法是采用自旋鎖的形式,即循環重試直到成功為止。這種方式在低競爭或短時間窗口內的并發更新時,相比于傳統的鎖機制,它避免了線程的阻塞和喚醒帶來的開銷,所以它的性能會更優。aKw28資訊網——每日最新資訊28at.com

Java中的CAS實現與API

在Java中,CAS操作的實現主要依賴于兩個關鍵組件:sun.misc.Unsafe類、jdk.internal.misc.Unsafe類以及java.util.concurrent.atomic包下的原子類。盡管Unsafe類提供了對底層硬件原子操作的直接訪問,但由于其API是非公開且不穩定的,所以在常規開發中并不推薦直接使用。Java標準庫提供了豐富的原子類,它們是基于Unsafe封裝的安全、便捷的CAS操作實現。aKw28資訊網——每日最新資訊28at.com

java.util.concurrent.atomic包

Java標準庫中的atomic包為開發者提供了許多原子類,如AtomicInteger、AtomicLong、AtomicReference等,它們均內置了CAS操作邏輯,使得我們可以在更高的抽象層級上進行無鎖并發編程。aKw28資訊網——每日最新資訊28at.com

aKw28資訊網——每日最新資訊28at.com

圖片圖片aKw28資訊網——每日最新資訊28at.com

而對于這個問題,其實也很好解決,我們給這個數據加上一個時間戳或者版本號(樂觀鎖概念)。即每次不僅比較值,還會比較版本。比如上述示例,初始時str的值的版本是1,然后線程2操作后值變成B,而對應版本變成了2,然后線程3操作后值變成了A,版本變成了3,而對于線程2來說,雖然值還是A,但是版本號變了,所以線程2依然會執行替換的操作。aKw28資訊網——每日最新資訊28at.com

Java的原子類就提供了類似的實現,如AtomicStampedReference和AtomicMarkableReference引入了附加的標記位或版本號,以便區分不同的修改序列。aKw28資訊網——每日最新資訊28at.com

圖片圖片aKw28資訊網——每日最新資訊28at.com

圖片圖片aKw28資訊網——每日最新資訊28at.com

總結

Java中的CAS原理及其在并發編程中的應用是一項非常重要的技術。CAS利用CPU硬件提供的原子指令,實現了在無鎖環境下的高效并發控制,避免了傳統鎖機制帶來的上下文切換和線程阻塞開銷。Java通過JNI接口調用底層的CAS指令,封裝在jdk.internal.misc類和java.util.concurrent.atomic包下的原子類中,為我們提供了簡潔易用的API來實現無鎖編程。aKw28資訊網——每日最新資訊28at.com

CAS在帶來并發性能提升的同時,也可能引發循環開銷過大、ABA問題等問題。針對這些問題,Java提供了如LongAdder、AtomicStampedReference和AtomicMarkableReference等工具類來解決ABA問題,同時也通過自適應自旋、適時放棄自旋轉而進入阻塞等待等方式降低循環開銷。aKw28資訊網——每日最新資訊28at.com

理解和熟練掌握CAS原理及其在Java中的應用,有助于我們在開發高性能并發程序時作出更明智的選擇,既能提高系統并發性能,又能保證數據的正確性和一致性。aKw28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-84469-0.html美團一面:什么是CAS?有什么優缺點?我說我知道AtomicInteger

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 在前端中,什么是幽靈依賴?

下一篇: 如何做配置鏈接的質量保障?看這篇就對了

標簽:
  • 熱門焦點
  • 小米官宣:2023年上半年出貨量中國第一!

    今日早間,小米電視官方微博帶來消息,稱2023年小米電視上半年出貨量達到了中國第一,同時還表示小米電視的巨屏風暴即將開始。“公布一個好消息2023年#小米電視上半年出貨量中國
  • 中興AX5400Pro+上手體驗:再升級 雙2.5G網口+USB 3.0這次全都有

    2021年11月的時候,中興先后發布了兩款路由器產品,中興AX5400和中興AX5400 Pro,從產品命名上就不難看出這是隸屬于同一系列的,但在外觀設計上這兩款產品可以說是完全沒一點關系
  • 小米平板5 Pro 12.4簡評:多專多能 兼顧影音娛樂的大屏利器

    疫情帶來了網課,網課盤活了安卓平板,安卓平板市場雖然中途停滯了幾年,但好的一點就是停滯的這幾年行業又有了新的發展方向,例如超窄邊框、高刷新率、多攝鏡頭組合等,這就讓安卓
  • 7月安卓手機好評榜:三星S23Ultra好評率第一

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年7月1日至7月31日,僅限國內市場。第一名:三星Galaxy S23 Ultra好評率:95.71%在即將迎來新
  • 十個可以手動編寫的 JavaScript 數組 API

    JavaScript 中有很多API,使用得當,會很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對它們進行一次小總結。現在開始吧。1.forEach()forEach()用于遍歷數組接收一參
  • 得物效率前端微應用推進過程與思考

    一、背景效率工程隨著業務的發展,組織規模的擴大,越來越多的企業開始意識到協作效率對于企業團隊的重要性,甚至是決定其在某個行業競爭中突圍的關鍵,是企業長久生存的根本。得物
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業發布的ESG報告。ESG是&ldquo;環境保
  • OPPO K11搭載高性能石墨散熱系統:旗艦同款 性能涼爽釋放

    日前OPPO官方宣布,將于7月25日14:30舉辦新品發布會,屆時全新的OPPO K11將正式與大家見面,將主打旗艦影像,和同檔位競品相比,其最大的賣點就是將配備索尼
  • 蘋果140W USB-C充電器:采用氮化鎵技術

    據10 月 30 日 9to5 Mac 消息報道,當蘋果推出新的 MacBook Pro 2021 時,該公司還推出了新的 140W USB-C 充電器,附贈在 MacBook Pro 16 英寸機型的盒子里,也支
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美与黑人午夜性猛交久久久| 亚洲日韩成人| 欧美理论电影网| 欧美剧在线免费观看网站| 国产精品久久97| 国产亚洲综合性久久久影院| 狠狠色丁香婷婷综合影院| 亚洲日本在线视频观看| 亚洲一区免费网站| 久久久人成影片一区二区三区| 奶水喷射视频一区| 国产精品免费看久久久香蕉| 国产自产女人91一区在线观看| 亚洲高清色综合| 亚洲在线中文字幕| 麻豆精品网站| 国产精品久久久久影院亚瑟 | 欧美视频中文字幕在线| 国产视频欧美| 99精品欧美一区二区蜜桃免费| 欧美伊人久久大香线蕉综合69| 欧美jizz19性欧美| 国产麻豆精品久久一二三| 亚洲精品黄色| 久久九九国产| 国产精品99一区二区| 亚洲第一在线综合网站| 亚洲自拍三区| 欧美激情一区二区三区不卡| 国产真实久久| 亚洲尤物视频网| 欧美精品久久久久久久| 国产亚洲欧美色| 一区二区三区三区在线| 美国成人毛片| 国产亚洲精品久久久久动| 一区二区三区四区五区精品视频| 久久亚洲精品中文字幕冲田杏梨| 国产精品国产三级国产| 亚洲精品在线免费观看视频| 久久久久久电影| 国产精品资源| 亚洲视频一起| 欧美久久在线| 亚洲国语精品自产拍在线观看| 欧美在线视频一区二区三区| 欧美视频日韩视频在线观看| 亚洲激情偷拍| 久热精品视频在线观看一区| 国产色综合天天综合网| 亚洲一区日韩| 欧美三级视频在线观看| 亚洲精品久久久蜜桃| 鲁大师影院一区二区三区| 国产综合一区二区| 亚洲欧美在线看| 欧美三级电影精品| 亚洲精品一区二区三| 免费观看成人www动漫视频| 国产一区在线视频| 午夜久久久久久| 国产精品久久久久天堂| 亚洲一二三区视频在线观看| 欧美日韩成人一区| 日韩一级免费观看| 欧美大片第1页| 亚洲国产精品成人va在线观看| 久久色在线观看| 精品电影一区| 久久永久免费| 黄色一区二区在线观看| 久久蜜桃香蕉精品一区二区三区| 国产在线视频欧美| 久久精品亚洲一区| 红桃视频国产精品| 久久性天堂网| 在线欧美日韩国产| 免费一级欧美在线大片| 亚洲国语精品自产拍在线观看| 男人的天堂亚洲在线| 最近中文字幕mv在线一区二区三区四区 | 国产精品久久波多野结衣| 日韩一级不卡| 欧美视频二区| 亚洲欧美卡通另类91av| 国产精品一卡二| 久久国产精品免费一区| 极品少妇一区二区三区| 美女尤物久久精品| 亚洲三级视频| 欧美午夜宅男影院| 亚洲欧美日本伦理| 国产日韩欧美| 久久人人97超碰国产公开结果| 一区在线观看| 欧美国产精品一区| 一区二区三区日韩| 国产精品自在在线| 久久九九久久九九| 亚洲国产日韩欧美在线动漫| 欧美日韩成人综合天天影院| 亚洲视频中文| 国产日韩精品在线播放| 久久亚洲春色中文字幕久久久| 亚洲国产精品一区二区第一页| 欧美韩国在线| 亚洲一区二区三区精品视频| 国产日韩欧美一区二区| 另类激情亚洲| 一区二区三区免费在线观看| 国产免费成人在线视频| 久久久蜜桃一区二区人| 亚洲裸体在线观看| 国产精品一二一区| 快she精品国产999| 一区二区三区成人| 国产一区二区三区黄视频| 欧美成人在线免费观看| 亚洲一区二区三区高清| 国产在线拍偷自揄拍精品| 欧美成人高清视频| 亚洲综合清纯丝袜自拍| 悠悠资源网亚洲青| 欧美午夜一区二区福利视频| 久久久欧美精品| 一区二区三区免费在线观看| 国产一区在线观看视频| 欧美日韩国产综合新一区| 欧美在线精品一区| 亚洲美女av在线播放| 国产欧美一区二区三区另类精品| 免费成人av在线看| 亚洲欧美变态国产另类| 亚洲国产精品小视频| 国产精品一页| 欧美精品国产精品日韩精品| 欧美在线观看视频| 日韩亚洲欧美综合| 精品粉嫩aⅴ一区二区三区四区| 欧美日一区二区在线观看 | 亚洲六月丁香色婷婷综合久久| 国产精品久久久久7777婷婷| 久久性天堂网| 亚洲欧美自拍偷拍| 亚洲精品影视| 一色屋精品视频在线看| 国产精品video| 欧美超级免费视 在线| 欧美一区二区三区电影在线观看| 亚洲国产成人高清精品| 国产伦精品一区二区三区视频黑人 | 另类酷文…触手系列精品集v1小说| 这里是久久伊人| 在线观看成人一级片| 国产精品免费在线| 欧美激情一区二区三区| 久久久久久一区| 亚洲欧美精品在线| 一区二区三区你懂的| 亚洲第一福利视频| 国产视频亚洲精品| 欧美午夜免费影院| 欧美激情按摩| 老司机aⅴ在线精品导航| 性色av一区二区三区| 一本一本久久a久久精品综合妖精| 激情六月婷婷久久| 国产欧美日韩免费看aⅴ视频| 欧美精品日韩一本| 麻豆乱码国产一区二区三区| 香蕉成人久久| 亚洲淫片在线视频| 99视频在线观看一区三区| 亚洲高清色综合| 激情久久综艺| 国产一区二区中文| 国产乱码精品1区2区3区| 国产精品播放| 欧美视频第二页| 欧美日韩国产色视频| 欧美激情亚洲一区| 欧美多人爱爱视频网站| 美女国产一区| 巨胸喷奶水www久久久免费动漫| 久久狠狠亚洲综合| 欧美中文日韩| 欧美一级黄色录像| 欧美亚洲色图校园春色| 亚洲欧美综合| 午夜精品福利视频| 亚洲女ⅴideoshd黑人| 亚洲一区影音先锋| 亚洲砖区区免费| 亚洲欧美视频在线| 午夜精品一区二区三区在线播放 | 欧美激情1区2区| 欧美精品v国产精品v日韩精品| 欧美jizzhd精品欧美巨大免费| 免费成年人欧美视频| 免费日韩精品中文字幕视频在线| 美女免费视频一区| 欧美大片专区| 欧美啪啪一区| 欧美午夜久久久|