亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java CAS操作與Unsafe類詳解

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

一、復習

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

二、兩者對比

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

三、在什么情況下才會使用volatile

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

四、Java中的原子性操作

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

五、Java中的CAS操作

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

六、ABA問題

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

七、Unsafe類

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

1.long objectFieldOffset(Field field)

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

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

2.int arrayBaseOffset(Class arrayClass)

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

3.int arrayIndexOffset(Class arrayClass)

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

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

可以見上文

八、源碼:

所在包:com.ruigege.OtherFoundationOfConcurrent2

https://github.com/ruigege66/ConcurrentJava

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

相關(guān)文章

  • Java Maven依賴傳遞,可選依賴,排除依賴詳解

    Java Maven依賴傳遞,可選依賴,排除依賴詳解

    這篇文章主要介紹了Java Maven依賴傳遞,可選依賴,排除依賴詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • JAVA操作MongoDB數(shù)據(jù)庫實例教程

    JAVA操作MongoDB數(shù)據(jù)庫實例教程

    MongoDB是一個文檔型數(shù)據(jù)庫,是NOSQL家族中最重要的成員之一,下面這篇文章主要給大家介紹了關(guān)于JAVA操作MongoDB數(shù)據(jù)庫的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • Java案例使用集合方法實現(xiàn)統(tǒng)計任意字符串中字符出現(xiàn)的次數(shù)

    Java案例使用集合方法實現(xiàn)統(tǒng)計任意字符串中字符出現(xiàn)的次數(shù)

    這篇文章主要介紹了Java案例使用集合方法實現(xiàn)統(tǒng)計任意字符串中字符出現(xiàn)的次數(shù),下面我們將用兩種方法實現(xiàn),需要的小伙伴可以參考一下文章具體內(nèi)容
    2022-04-04
  • Go Java算法重復的DNA序列詳解

    Go Java算法重復的DNA序列詳解

    這篇文章主要為大家介紹了Go Java算法之重復的DNA序列的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • java多線程Synchronized實現(xiàn)可見性原理解析

    java多線程Synchronized實現(xiàn)可見性原理解析

    這篇文章主要介紹了java多線程Synchronized實現(xiàn)可見性原理,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • 使用filter實現(xiàn)url級別內(nèi)存緩存示例

    使用filter實現(xiàn)url級別內(nèi)存緩存示例

    這篇文章主要介紹了使用filter實現(xiàn)url級別內(nèi)存緩存示例,只需要一個靜態(tài)類,在filter中調(diào)用,也可以全部寫到filt里面。可以根據(jù)查詢參數(shù)分別緩存,需要的朋友可以參考下
    2014-03-03
  • Java實現(xiàn)文件分片上傳接口的示例代碼

    Java實現(xiàn)文件分片上傳接口的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)文件分片上傳的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-07-07
  • Spring的自動裝配常用注解詳解

    Spring的自動裝配常用注解詳解

    這篇文章主要介紹了Spring的自動裝配常用注解詳解,自動裝配就是指 Spring 容器在不使用 <constructor-arg> 和<property> 標簽的情況下,可以自動裝配相互協(xié)作的 Bean 之間的關(guān)聯(lián)關(guān)系,將一個 Bean 注入其他 Bean 的 Property 中,需要的朋友可以參考下
    2023-08-08
  • SpringBoot配置Https入門實踐

    SpringBoot配置Https入門實踐

    本文主要介紹了SpringBoot配置Https入門實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-11-11
  • springboot中如何判斷某個bean是否存在

    springboot中如何判斷某個bean是否存在

    這篇文章主要介紹了springboot中如何判斷某個bean是否存在,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論