最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java CAS操作與Unsafe類詳解

 更新時(shí)間:2021年02月27日 09:50:36   作者:心悅君兮君不知-睿  
這篇文章主要介紹了Java CAS操作與Unsafe類的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下

一、復(fù)習(xí)

計(jì)算機(jī)內(nèi)存模型,synchronized和volatile關(guān)鍵字簡(jiǎn)介

二、兩者對(duì)比

sychronized和volatile都解決了內(nèi)存可見性問題
不同點(diǎn):
(1)前者是獨(dú)占鎖,并且存在者上下文切換的開銷以及線程重新調(diào)度的開銷;后者是非阻塞算法,不會(huì)造成上下文切換的開銷。
(2)前者可以保證操作的原子性,但是后者不能保證操作的原子性。

三、在什么情況下才會(huì)使用volatile

  • 寫入變量是不依賴當(dāng)前值的,如果是依賴當(dāng)前值的話,由于獲取-計(jì)算-寫入,三者不是原子性操作,而volatile是保證原子性操作的。
  • 變量沒有加鎖的時(shí)候,如果變量加鎖了,是可以保證內(nèi)存的可見性的因此不需要再使用volatile

四、Java中的原子性操作

  • 原子性操作通俗的來講就是一組操作,要么都執(zhí)行成功,要么都執(zhí)行失敗,不存在執(zhí)行部分成功的情況
  • 使用synchronized關(guān)鍵字既可以保證操作的原子性又可以保證內(nèi)存的可見性,volatile只能保證內(nèi)存的可見性,但是不能保證操作的原子性;synchronized固然好,但在高并發(fā)的情況下,由于它是一種獨(dú)占鎖,因此會(huì)引起性能低下的問題。

五、Java中的CAS操作

  • 定義:CAS(compare and swap)比較并交換,這是JDK提供的一種非阻塞算法,它通過硬件保證了比較-更新的原子性問題。JDK中的Unsafe類提供了一系列的compareAndSwap*方法,下面以compareAndSwapLong為例進(jìn)行講解
  • boolean compare(Object obj,long offset,long expect,long update)
  • 先分別解釋一下各個(gè)參數(shù),obj是一個(gè)對(duì)象的引用(也就是對(duì)象存儲(chǔ)的地址),offset是相對(duì)于前面地址的偏移量,expect是一個(gè)預(yù)想的值,update代表如果和預(yù)想的值一樣,那么就是使用update這個(gè)值來代替,并且返回true,否則返回false
  • 這是處理器提供的一種原子性指令

六、ABA問題

  • 描述:線程1獲取變量x的值為A,然后嘗試修改為B,但是此時(shí)如果有另一個(gè)線程修改了x的值為B,同時(shí)又修改成了A,那么線程2的這個(gè)A和線程1之前的A就不是同一個(gè)A了
  • 產(chǎn)生原因:環(huán)形依賴,變量的值從A到B,然后又從B到A,這樣只能一個(gè)方向輪轉(zhuǎn),如果是從A到B,然后從B到C就不會(huì)出現(xiàn)這種情況。
  • 解決方式:JDK中的AtomicStampedReferece給每個(gè)變量一個(gè)時(shí)間戳,從而避免了ABA問題

七、Unsafe類

在JDK中的rt.jar包中有許多方法都是native的,這是一種硬件級(jí)別的操作,使用JNI來調(diào)用C++底層函數(shù)來操作。

1.long objectFieldOffset(Field field)

釋義:獲取某個(gè)對(duì)象的中的某個(gè)域值所在對(duì)象的中的內(nèi)存偏移量

try{
 long value = Unsafe.objectFieldOffset(AutomicLong.class.getDeclaredField("value"));
}catch(Exception e){
 e.printStackTrace();
}

2.int arrayBaseOffset(Class arrayClass)

釋義:獲取數(shù)組中的第一個(gè)元素地址

3.int arrayIndexOffset(Class arrayClass)

釋義:獲取數(shù)組中第一個(gè)元素的字節(jié)大小

4.boolean compareAndSwapLong(Object obj,long offset,long expect,long update)

可以見上文

八、源碼:

所在包:com.ruigege.OtherFoundationOfConcurrent2

https://github.com/ruigege66/ConcurrentJava

以上就是Java CAS操作與Unsafe類詳解的詳細(xì)內(nèi)容,更多關(guān)于Java CAS操作與Unsafe類的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring的連接數(shù)據(jù)庫(kù)以及JDBC模板(實(shí)例講解)

    Spring的連接數(shù)據(jù)庫(kù)以及JDBC模板(實(shí)例講解)

    下面小編就為大家?guī)硪黄猄pring的連接數(shù)據(jù)庫(kù)以及JDBC模板(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • IntelliJ IDEA 中必有得插件和配置

    IntelliJ IDEA 中必有得插件和配置

    這篇文章主要介紹了IntelliJ IDEA 中必有得插件和配置,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Mybatis SqlSessionFactory與SqlSession詳細(xì)講解

    Mybatis SqlSessionFactory與SqlSession詳細(xì)講解

    SqlSessionFactory是MyBatis的核心類之一,其最重要的功能就是提供創(chuàng)建MyBatis的核心接口SqlSession,所以我們需要先創(chuàng)建SqlSessionFactory,為此我們需要提供配置文件和相關(guān)的參數(shù)
    2022-11-11
  • SpringBoot3實(shí)戰(zhàn)教程之實(shí)現(xiàn)接口簽名驗(yàn)證功能

    SpringBoot3實(shí)戰(zhàn)教程之實(shí)現(xiàn)接口簽名驗(yàn)證功能

    接口簽名是一種重要的安全機(jī)制,用于確保 API 請(qǐng)求的真實(shí)性、數(shù)據(jù)的完整性以及防止重放攻擊,這篇文章主要介紹了SpringBoot3實(shí)戰(zhàn)教程之實(shí)現(xiàn)接口簽名驗(yàn)證功能,需要的朋友可以參考下
    2025-04-04
  • SpringBoot-Admin實(shí)現(xiàn)微服務(wù)監(jiān)控+健康檢查+釘釘告警

    SpringBoot-Admin實(shí)現(xiàn)微服務(wù)監(jiān)控+健康檢查+釘釘告警

    本文主要介紹了SpringBoot-Admin實(shí)現(xiàn)微服務(wù)監(jiān)控+健康檢查+釘釘告警,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 關(guān)于HashMap 并發(fā)時(shí)會(huì)引起死循環(huán)的問題解析

    關(guān)于HashMap 并發(fā)時(shí)會(huì)引起死循環(huán)的問題解析

    JDK1.8之前采用頭插,即在鏈表結(jié)構(gòu)上每次都把數(shù)據(jù)放在鏈表頭部。JDK1.8采用尾插方法,很多朋友在學(xué)習(xí)Java并發(fā)容器和框架時(shí),看到為什么要使用ConcurrentHashMap時(shí)不知道究其原因,今天小編通過本文給大家介紹下HashMap 并發(fā)死循環(huán)問題,一起看看吧
    2021-05-05
  • 簡(jiǎn)單了解Java日志脫敏框架sensitive

    簡(jiǎn)單了解Java日志脫敏框架sensitive

    這篇文章主要介紹了簡(jiǎn)單了解Java日志脫敏框架sensitive,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • java判斷對(duì)象中某個(gè)屬性是否為空方法代碼

    java判斷對(duì)象中某個(gè)屬性是否為空方法代碼

    這篇文章主要給大家介紹了關(guān)于java判斷對(duì)象中某個(gè)屬性是否為空的相關(guān)資料,最近遇到后臺(tái)接收值的時(shí)候,需要對(duì)接收對(duì)象進(jìn)行非空校驗(yàn),需要的朋友可以參考下
    2023-07-07
  • Java?Lombok實(shí)現(xiàn)手機(jī)號(hào)碼校驗(yàn)的示例代碼

    Java?Lombok實(shí)現(xiàn)手機(jī)號(hào)碼校驗(yàn)的示例代碼

    手機(jī)號(hào)碼校驗(yàn)通常是系統(tǒng)開發(fā)中最基礎(chǔ)的功能之一,本文主要介紹了Java?Lombok實(shí)現(xiàn)手機(jī)號(hào)碼校驗(yàn)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Mybatis邏輯分頁(yè)與物理分頁(yè)P(yáng)ageHelper使用解析

    Mybatis邏輯分頁(yè)與物理分頁(yè)P(yáng)ageHelper使用解析

    這篇文章主要為大家介紹了Mybatis邏輯分頁(yè)與物理分頁(yè)P(yáng)ageHelper使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評(píng)論

尚志市| 桃园县| 青冈县| 涿州市| 梧州市| 永城市| 兴和县| 信阳市| 息烽县| 南宁市| 南开区| 平山县| 根河市| 信丰县| 桦川县| 聂荣县| 黄石市| 宁乡县| 邳州市| 佛坪县| 微山县| 措勤县| 南乐县| 朝阳区| 同仁县| 新宾| 岑巩县| 长春市| 阳西县| 遂溪县| 囊谦县| 赣榆县| 日照市| 咸阳市| 黄浦区| 晋宁县| 汉沽区| 东光县| 丽水市| 金坛市| 张家川|