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

Java并發(fā)編程之原子操作類詳情

 更新時間:2022年04月15日 17:58:24   作者:派大大大星?  
這篇文章主要介紹了Java并發(fā)編程之原子操作類詳情,文章基于Java并發(fā)編程展開相關內容,具有一定的參考價值,需要的小伙伴可以參考一下

JUC包提供了一系列的原子性操作類,這些類都是使用非阻塞算法CAS實現(xiàn)的,相比使用鎖實現(xiàn)原子性操作者在性能上有很大提升。JUC包中含有AtomicInteger、AtomicLong、AtomicBoolean,它們的原理類似。下面我們以AtomicLong為例來講解。

我們先來看一下部分源碼:

public class AtomicLong extends Number implements java.io.Serializable {
    private static final long serialVersionUID = 1927816293512124184L;

    //1.獲取Unsafe類實例
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    //2.存放value的偏移量
    private static final long valueOffset;
    static final boolean VM_SUPPORTS_LONG_CAS = VMSupportsCS8();

    //3.用于判斷是否支持Long類型無鎖CAS
    private static native boolean VMSupportsCS8();

    static {
        try {
            //4.獲取value在AtomicLong中的偏移量
            valueOffset = unsafe.objectFieldOffset
                (AtomicLong.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }
    //5.實際變量值
    private volatile long value;

    /**
     * Creates a new AtomicLong with the given initial value.
     *
     * @param initialValue the initial value
     */
    public AtomicLong(long initialValue) {
        value = initialValue;
    }
    ············省略部分代碼·············
}

上面代碼中,代碼1處通過Unsafe.getUnsafe()獲取到Unsafe類的實例(因為AtomicLong類是在rt.jar包下面的,AtomicLong類就是通過Bootstarp類加載器進行加載的)。代碼5處,value被聲明為volatile類型,保證內存的可見性。通過代碼2,4獲取value變量在AtomicLong類中的偏移量。

接下來介紹一下AtomicLong中的主要函數(shù):

  • 遞增和遞減代碼
//調用unsafe方法,設置value=value+1后,返回原始的值
public final long getAndIncrement() {
    return unsafe.getAndAddLong(this, valueOffset, 1L);
}

//調用unsafe方法,設置value=value-1后,返回原始的值
public final long getAndDecrement() {
    return unsafe.getAndAddLong(this, valueOffset, -1L);
}


//調用unsafe方法,設置value=value+1后,返回遞增后的值
public final long incrementAndGet() {
    return unsafe.getAndAddLong(this, valueOffset, 1L) + 1L;
}

//調用unsafe方法,設置value=value-1后,返回遞減后的值
public final long decrementAndGet() {
    return unsafe.getAndAddLong(this, valueOffset, -1L) - 1L;
}

上面的四個函數(shù)內部都是通過調用Unsafe的getAndAddLong方法來實現(xiàn)操作,這個函數(shù)是個原子性操作,這里第一個參數(shù)是AtomicLong實例的引用的,第二個參數(shù)是value變量在AtomicLong的偏移值,第三個參數(shù)是要設置的第二個變量的值。

其中getAndIncrement()方法在JDK7中實現(xiàn)邏輯為:

public final long getAndIncrement() {
    while(true) {
        long current = get();
        long next = current + 1;
        if (compareAndSet(current, next))
            return current;
    }
}

如上代碼中,每個線程是先拿到變量的當前值(由于value是volatile變量,所以這是獲取的最新值),然后在工作內存中對其進行增1操作,而后使用CAS修改變量的值,如果設置失敗,則循環(huán)繼續(xù)嘗試,直到設置成功。

JDK8中的邏輯為:

public final long getAndIncrement() {
        retrturn unsafe.getAndAddLong(this, valueOffset, 1L);
    }

其中JDK8中的unsafe.getAndAddLong的代碼為:

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;
}

從中可以看到,JDK7中的AtomicLong中循環(huán)邏輯已經被JDK8中的原子操作類Unsafe內置了。

  • boolean compareAndSet(long expect,long update)
public final boolean compareAndSet(long expect,long update) 
{
    return unsafe.compareAndSwapLong(this, valueOffset, expect, update);
}

函數(shù)在內部調用了unsafe.compareAndSwapLong方法。如果原子變量中的value值等于expect,則使用update值更新該值并返回true,否則返回false。

到此這篇關于Java并發(fā)編程之原子操作類詳情的文章就介紹到這了,更多相關Java 原子操作類內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 解決Mybatis?mappe同時傳遞?List?和其他參數(shù)報錯的問題

    解決Mybatis?mappe同時傳遞?List?和其他參數(shù)報錯的問題

    在使用MyBatis時,如果需要傳遞多個參數(shù)到SQL中,可以遇到參數(shù)綁定問題,解決方法包括使用@Param注解和修改mapper.xml配置,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Spring Boot對Future模式的支持詳解

    Spring Boot對Future模式的支持詳解

    這篇文章主要給大家介紹了關于Spring Boot對Future模式的支持的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot具有一定的參考學習價值,需要的朋友們下面來一起看看吧
    2019-01-01
  • Java實現(xiàn)獲取小程序帶參二維碼并保存到本地

    Java實現(xiàn)獲取小程序帶參二維碼并保存到本地

    這篇文章主要介紹了Java實現(xiàn)獲取小程序帶參二維碼并保存到本地,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java動態(tài)規(guī)劃之硬幣找零問題實現(xiàn)示例

    Java動態(tài)規(guī)劃之硬幣找零問題實現(xiàn)示例

    本文主要介紹了Java動態(tài)規(guī)劃之硬幣找零問題實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • idea啟動Tomcat時控制臺亂碼的解決方法(親測有效)

    idea啟動Tomcat時控制臺亂碼的解決方法(親測有效)

    最近在idea中啟動tomcat出現(xiàn)控制臺亂碼問題,嘗試了很多方法,最后終于解決了,所以下面這篇文章主要給大家介紹了關于idea啟動Tomcat時控制臺亂碼的解決方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • IDEA使用properties配置文件進行mysql數(shù)據庫連接的教程圖解

    IDEA使用properties配置文件進行mysql數(shù)據庫連接的教程圖解

    Properties類是 鍵和值均為字符串的可以永久存儲到文件中的key-value集合。這篇文章主要介紹了IDEA使用properties配置文件進行mysql數(shù)據路連接 ,需要的朋友可以參考下
    2018-10-10
  • Quartz中的Job與JobDetail解析

    Quartz中的Job與JobDetail解析

    這篇文章主要介紹了Quartz中的Job與JobDetail解析,你定義了一個實現(xiàn)Job接口的類,這個類僅僅表明該job需要完成什么類型的任務,除此之外,Quartz還需要知道該Job實例所包含的屬性;這將由JobDetail類來完成,需要的朋友可以參考下
    2023-11-11
  • Java多線程實現(xiàn)FTP批量上傳文件

    Java多線程實現(xiàn)FTP批量上傳文件

    這篇文章主要為大家詳細介紹了Java多線程實現(xiàn)FTP批量上傳文件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • java使用SFTP上傳文件到資源服務器

    java使用SFTP上傳文件到資源服務器

    這篇文章主要介紹了java使用SFTP上傳文件到資源服務器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 通俗講解JVM的類加載機制

    通俗講解JVM的類加載機制

    這篇文章主要介紹了JVM的類加載機制的相關資料,幫助大家更好的理解和學習Java,感興趣的朋友可以了解下
    2020-09-09

最新評論

陆丰市| 丹阳市| 马边| 石城县| 江都市| 浑源县| 扶余县| 方城县| 长顺县| 融水| 罗甸县| 泰来县| 惠来县| 禹州市| 马龙县| 海伦市| 清水河县| 确山县| 宜君县| 宝山区| 东丰县| 克什克腾旗| 吉首市| 吴江市| 天祝| 拉孜县| 阿克苏市| 玉树县| 布尔津县| 邵阳县| 繁昌县| 嘉义县| 双峰县| 兴安盟| 嵩明县| 团风县| 宜黄县| 离岛区| 巴林左旗| 双鸭山市| 遵化市|