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

Java多線程之原子類(lèi)解析

 更新時(shí)間:2023年10月24日 08:47:38   作者:假裝你是大灰狼  
這篇文章主要介紹了Java多線程之原子類(lèi)解析,Java原子類(lèi)是一種多線程編程中常用的工具,用于實(shí)現(xiàn)線程安全的操作,它們提供了一種原子性操作的機(jī)制,確保多個(gè)線程同時(shí)訪問(wèn)共享變量時(shí)的數(shù)據(jù)一致性,需要的朋友可以參考下

前言

Java提供的原子類(lèi)是靠 sun 基于 CAS 實(shí)現(xiàn)的,CAS 是一種樂(lè)觀鎖。

原子變量類(lèi)相當(dāng)于一種泛化的 volatile 變量,能夠支持原子的和有條件的讀-改-寫(xiě)操作。AtomicInteger 表示一個(gè)int類(lèi)型的值,并提供了 get 和 set 方法,這些 Volatile 類(lèi)型的int變量在讀取和寫(xiě)入上有著相同的內(nèi)存語(yǔ)義。它還提供了一個(gè)原子的 compareAndSet 方法(如果該方法成功執(zhí)行,那么將實(shí)現(xiàn)與讀取/寫(xiě)入一個(gè) volatile 變量相同的內(nèi)存效果),以及原子的添加、遞增和遞減等方法。AtomicInteger 表面上非常像一個(gè)擴(kuò)展的 Counter 類(lèi),但在發(fā)生競(jìng)爭(zhēng)的情況下能提供更高的可伸縮性,因?yàn)樗苯永昧擞布?duì)并發(fā)的支持。

AtomicInteger的實(shí)現(xiàn)

AtomicInteger 是一個(gè)支持原子操作的 Integer 類(lèi),就是保證對(duì) AtomicInteger 類(lèi)型變量的增加和減少操作是原子性的,不會(huì)出現(xiàn)多個(gè)線程下的數(shù)據(jù)不一致問(wèn)題。如果不使用 AtomicInteger,要實(shí)現(xiàn)一個(gè)按順序獲取的 ID,就必須在每次獲取時(shí)進(jìn)行加鎖操作,以避免出現(xiàn)并發(fā)時(shí)獲取到同樣的 ID 的現(xiàn)象。

接下來(lái)通過(guò)源代碼來(lái)看 AtomicInteger 具體是如何實(shí)現(xiàn)的原子操作。

首先看 value 的聲明:

private volatile int value;

volatile 修飾的 value 變量,保證了變量的可見(jiàn)性。

incrementAndGet() 方法,下面是具體的代碼:

public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return next;
    }
}

通過(guò)源碼,可以知道,這個(gè)方法的做法為先獲取到當(dāng)前的 value 屬性值,然后將 value 加 1,賦值給一個(gè)局部的 next 變量,然而,這兩步都是非線程安全的,但是內(nèi)部有一個(gè)死循環(huán),不斷去做 compareAndSet 操作,直到成功為止,也就是修改的根本在 compareAndSet 方法里面,compareAndSet()方法的代碼如下:

public final boolean compareAndSet(int expect, int update) {
    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

compareAndSet()方法調(diào)用的compareAndSwapInt()方法的聲明如下,是一個(gè)native方法。

public final native boolean compareAndSwapInt(Object var1, long var2, int var4, intvar5);

compareAndSet 傳入的為執(zhí)行方法時(shí)獲取到的 value 屬性值,next 為加 1 后的值, compareAndSet 所做的為調(diào)用 Sun 的 UnSafe 的 compareAndSwapInt 方法來(lái)完成,此方法為 native 方法,compareAndSwapInt 基于的是 CPU 的 CAS 指令來(lái)實(shí)現(xiàn)的。所以基于 CAS 的操作可認(rèn)為是無(wú)阻塞的,一個(gè)線程的失敗或掛起不會(huì)引起其它線程也失敗或掛起。并且由于 CAS 操作是 CPU 原語(yǔ),所以性能比較好。

類(lèi)似的,還有 decrementAndGet() 方法。它和 incrementAndGet() 的區(qū)別是將 value 減 1,賦值給next 變量。

AtomicInteger 中還有 getAndIncrement() 和 getAndDecrement() 方法,他們的實(shí)現(xiàn)原理和上面的兩個(gè)方法完全相同,區(qū)別是返回值不同,前兩個(gè)方法返回的是改變之后的值,即 next。而這兩個(gè)方法返回的是改變之前的值,即 current。還有很多的其他方法,就不列舉了。

CAS算法

CAS(Compare-And-Swap)算法保證數(shù)據(jù)操作的原子性。

CAS 算法是硬件對(duì)于并發(fā)操作共享數(shù)據(jù)的支持。

CAS 包含了三個(gè)操作數(shù):

  • 內(nèi)存值 V
  • 預(yù)估值 A
  • 更新值 B

當(dāng)且僅當(dāng) V == A 時(shí),V 將被賦值為 B,否則循環(huán)著不斷進(jìn)行判斷 V 與 A 是否相等。

關(guān)于樂(lè)觀鎖與悲觀鎖

樂(lè)觀鎖(Optimistic Lock), 顧名思義,就是很樂(lè)觀,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人不會(huì)修改,所以不會(huì)上鎖,但是在更新的時(shí)候會(huì)判斷一下在此期間別人有沒(méi)有去更新這個(gè)數(shù)據(jù),可以使用版本號(hào)等機(jī)制。樂(lè)觀鎖適用于多讀的應(yīng)用類(lèi)型,這樣可以提高吞吐量,像數(shù)據(jù)庫(kù)如果提供類(lèi)似于write_condition機(jī)制的其實(shí)都是提供的樂(lè)觀鎖。

CAS便是樂(lè)觀鎖技術(shù),當(dāng)多個(gè)線程嘗試使用CAS同時(shí)更新同一個(gè)變量時(shí),只有其中一個(gè)線程能更新變量的值,而其它線程都失敗,失敗的線程并不會(huì)被掛起,而是被告知這次競(jìng)爭(zhēng)中失敗,并可以再次嘗試。

CAS有3個(gè)操作數(shù),內(nèi)存值V,舊的預(yù)期值A(chǔ),要修改的新值B。當(dāng)且僅當(dāng)預(yù)期值A(chǔ)和內(nèi)存值V相同時(shí),將內(nèi)存值V修改為B,否則什么都不做。

悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿數(shù)據(jù)的時(shí)候都認(rèn)為別人會(huì)修改,所以每次在拿數(shù)據(jù)的時(shí)候都會(huì)上鎖,這樣別人想拿這個(gè)數(shù)據(jù)就會(huì)block直到它拿到鎖。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)里邊就用到了很多這種鎖機(jī)制,比如行鎖,表鎖等,讀鎖,寫(xiě)鎖等,都是在做操作之前先上鎖。

比如說(shuō)synchronized就是一種獨(dú)占鎖,他假設(shè)最壞的情況,并且只有在確保其它線程不會(huì)造成干擾的情況下執(zhí)行,會(huì)導(dǎo)致其它所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖。

缺點(diǎn):

由于在進(jìn)程掛起和恢復(fù)執(zhí)行過(guò)程中存在著很大的開(kāi)銷(xiāo)。當(dāng)一個(gè)線程正在等待鎖時(shí),它不能做任何事。舉個(gè)栗子,如果一個(gè)線程需要某個(gè)資源,但是這個(gè)資源的占用時(shí)間很短,當(dāng)線程第一次搶占這個(gè)資源時(shí),可能這個(gè)資源被占用,如果此時(shí)掛起這個(gè)線程,可能立刻就發(fā)現(xiàn)資源可用,然后又需要花費(fèi)很長(zhǎng)的時(shí)間重新?lián)屨兼i,時(shí)間代價(jià)就會(huì)非常的高。

到此這篇關(guān)于Java多線程之原子類(lèi)解析的文章就介紹到這了,更多相關(guān)Java原子類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java Springboot之Spring家族的技術(shù)體系

    Java Springboot之Spring家族的技術(shù)體系

    今天帶大家來(lái)學(xué)習(xí)Spring家族的技術(shù)體系,文中有非常詳細(xì)的圖文介紹及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Spring與Struts整合之使用自動(dòng)裝配操作示例

    Spring與Struts整合之使用自動(dòng)裝配操作示例

    這篇文章主要介紹了Spring與Struts整合之使用自動(dòng)裝配操作,結(jié)合實(shí)例形式詳細(xì)分析了Spring與Struts整合使用自動(dòng)裝配具體操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2020-01-01
  • 如何應(yīng)對(duì)spring框架的HTTP ERROR 400 Bad Request錯(cuò)誤返回問(wèn)題

    如何應(yīng)對(duì)spring框架的HTTP ERROR 400 Bad Request錯(cuò)

    這篇文章主要介紹了如何應(yīng)對(duì)spring框架的HTTP ERROR 400 Bad Request錯(cuò)誤返回問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Maven中央倉(cāng)庫(kù)地址配置大全

    Maven中央倉(cāng)庫(kù)地址配置大全

    這篇文章主要介紹了Maven中央倉(cāng)庫(kù)地址配置大全,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • SpringBoot整合mybatis/mybatis-plus實(shí)現(xiàn)數(shù)據(jù)持久化的操作

    SpringBoot整合mybatis/mybatis-plus實(shí)現(xiàn)數(shù)據(jù)持久化的操作

    這篇文章主要介紹了SpringBoot整合mybatis/mybatis-plus實(shí)現(xiàn)數(shù)據(jù)持久化,本節(jié)內(nèi)容我們介紹了數(shù)據(jù)持久化的相關(guān)操作,并且是基礎(chǔ)傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)——mysql,需要的朋友可以參考下
    2022-10-10
  • Java 判斷數(shù)組是否相等的方法示例

    Java 判斷數(shù)組是否相等的方法示例

    這篇文章主要介紹了Java 判斷數(shù)組是否相等的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 超詳細(xì)的Spring Boot入門(mén)筆記(總結(jié))

    超詳細(xì)的Spring Boot入門(mén)筆記(總結(jié))

    本篇文章主要介紹了超詳細(xì)的Spring Boot入門(mén)筆記(總結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • springboot實(shí)現(xiàn)增加黑名單和白名單功能

    springboot實(shí)現(xiàn)增加黑名單和白名單功能

    本文主要介紹了springboot實(shí)現(xiàn)增加黑名單和白名單功能,就是單純的實(shí)現(xiàn)filter,然后注冊(cè)到springboot里面,在filter里面進(jìn)行黑白名單的篩選,感興趣的可以了解一下
    2024-05-05
  • Java的JSON處理器fastjson使用方法詳解

    Java的JSON處理器fastjson使用方法詳解

    下面小編就為大家?guī)?lái)一篇Java的JSON處理器fastjson使用方法詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • nacos配置ENC(...)加密實(shí)現(xiàn)方式

    nacos配置ENC(...)加密實(shí)現(xiàn)方式

    文章介紹在SpringBoot中使用Jasypt加密敏感配置(如數(shù)據(jù)庫(kù)密碼),通過(guò)添加依賴(lài)、配置密鑰、定義自定義加密器Bean實(shí)現(xiàn)加密解密,強(qiáng)調(diào)密鑰安全、日志保密及算法選擇,確保配置信息安全
    2025-09-09

最新評(píng)論

黄大仙区| 潜山县| 民丰县| 虞城县| 文化| 马公市| 西城区| 乌苏市| 马边| 新宾| 莱阳市| 博乐市| 鹤峰县| 土默特左旗| 石柱| 和静县| 湾仔区| 庆安县| 林州市| 石阡县| 三台县| 岐山县| 岗巴县| 昭觉县| 青海省| 纳雍县| 兴化市| 岢岚县| 资兴市| 永修县| 明溪县| 静宁县| 隆回县| 四平市| 靖州| 内黄县| 喀什市| 连云港市| 家居| 临泉县| 青河县|