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

Java并發(fā)編程包中atomic的實現(xiàn)原理示例詳解

 更新時間:2018年09月13日 15:41:45   作者:林灣村龍貓  
這篇文章主要給大家介紹了關(guān)于Java并發(fā)編程包中atomic的實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

線程安全:

當(dāng)多個線程訪問某個類時,不管運行時環(huán)境采用何種調(diào)度方式或者這些進程將如何交替執(zhí)行,并且在主調(diào)代碼中不需要任何額外的同步或協(xié)調(diào),這個類都能表現(xiàn)出正確的行為,那么就稱這個類時線程安全的。

線程安全主要體現(xiàn)在以下三個方面:

原子性:提供了互斥訪問,同一時刻只能有一個線程對它進行操作

可見性:一個線程對主內(nèi)存的修改可以及時的被其他線程觀察到

有序性:一個線程觀察其他線程中的指令執(zhí)行順序,由于指令重排序的存在,該觀察結(jié)果一般雜亂無序

引子

在多線程的場景中,我們需要保證數(shù)據(jù)安全,就會考慮同步的方案,通常會使用synchronized或者lock來處理,使用了synchronized意味著內(nèi)核態(tài)的一次切換。這是一個很重的操作。

有沒有一種方式,可以比較便利的實現(xiàn)一些簡單的數(shù)據(jù)同步,比如計數(shù)器等等。concurrent包下的atomic提供我們這么一種輕量級的數(shù)據(jù)同步的選擇。

使用例子

import java.util.concurrent.CountDownLatch; 
import java.util.concurrent.atomic.AtomicInteger; 
 
public class App { 
 
 public static void main(String[] args) throws Exception { 
  CountDownLatch countDownLatch = new CountDownLatch(100); 
 
  AtomicInteger atomicInteger = new AtomicInteger(0); 
  for (int i = 0; i < 100; i++) { 
   new Thread() { 
    @Override 
    public void run() { 
     atomicInteger.getAndIncrement(); 
 
     countDownLatch.countDown(); 
    } 
   }.start(); 
  } 
 
  countDownLatch.await(); 
 
  System.out.println(atomicInteger.get()); 
 } 
} 

在以上代碼中,使用AtomicInteger聲明了一個全局變量,并且在多線程中進行自增,代碼中并沒有進行顯示的加鎖。

以上代碼的輸出結(jié)果,永遠都是100。如果將AtomicInteger換成Integer,打印結(jié)果基本都是小于100。

也就說明AtomicInteger聲明的變量,在多線程場景中的自增操作是可以保證線程安全的。接下來我們分析下其原理。

原理

我們可以看一下AtomicInteger的代碼

他的值是存在一個volatile的int里面。volatile只能保證這個變量的可見性。不能保證他的原子性。

可以看看getAndIncrement這個類似i++的函數(shù),可以發(fā)現(xiàn),是調(diào)用了UnSafe中的getAndAddInt。

UnSafe是何方神圣?UnSafe提供了java可以直接操作底層的能力。

進一步,我們可以發(fā)現(xiàn)實現(xiàn)方式:

如何保證原子性:自旋 + CAS(樂觀鎖)。在這個過程中,通過compareAndSwapInt比較更新value值,如果更新失敗,重新獲取舊值,然后更新。

優(yōu)缺點

CAS相對于其他鎖,不會進行內(nèi)核態(tài)操作,有著一些性能的提升。但同時引入自旋,當(dāng)鎖競爭較大的時候,自旋次數(shù)會增多。cpu資源會消耗很高。

換句話說,CAS+自旋適合使用在低并發(fā)有同步數(shù)據(jù)的應(yīng)用場景。

Java 8做出的改進和努力

在Java 8中引入了4個新的計數(shù)器類型,LongAdder、LongAccumulator、DoubleAdder、DoubleAccumulator。他們都是繼承于Striped64。

在LongAdder 與AtomicLong有什么區(qū)別?

Atomic*遇到的問題是,只能運用于低并發(fā)場景。因此LongAddr在這基礎(chǔ)上引入了分段鎖的概念??梢詤⒖肌禞DK8系列之LongAdder解析》一起看看做了什么。

大概就是當(dāng)競爭不激烈的時候,所有線程都是通過CAS對同一個變量(Base)進行修改,當(dāng)競爭激烈的時候,會將根據(jù)當(dāng)前線程哈希到對于Cell上進行修改(多段鎖)。

可以看到大概實現(xiàn)原理是:通過CAS樂觀鎖保證原子性,通過自旋保證當(dāng)次修改的最終修改成功,通過降低鎖粒度(多段鎖)增加并發(fā)性能。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Java實現(xiàn)圖書管理系統(tǒng)的示例代碼

    Java實現(xiàn)圖書管理系統(tǒng)的示例代碼

    這篇文章將通過Java實現(xiàn)一個簡答的圖書管理系統(tǒng),本圖書管理系統(tǒng)用對象數(shù)組的方式來提供操作方法,比較特別,建議新手學(xué)習(xí),這對理解Java面向?qū)ο笥泻艽髱椭?/div> 2022-11-11
  • Java多線程教程之如何利用Future實現(xiàn)攜帶結(jié)果的任務(wù)

    Java多線程教程之如何利用Future實現(xiàn)攜帶結(jié)果的任務(wù)

    Callable與Future兩功能是Java?5版本中加入的,這篇文章主要給大家介紹了關(guān)于Java多線程教程之如何利用Future實現(xiàn)攜帶結(jié)果任務(wù)的相關(guān)資料,需要的朋友可以參考下
    2021-12-12
  • Java中的同步與異步詳細介紹

    Java中的同步與異步詳細介紹

    這篇文章主要介紹了Java中的同步與異步詳細介紹,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 深入理解Java8雙冒號::的使用

    深入理解Java8雙冒號::的使用

    這篇文章主要介紹了深入理解Java8雙冒號::的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • idea中如何創(chuàng)建scala項目

    idea中如何創(chuàng)建scala項目

    idea中創(chuàng)建scala項目有三種方式1.通過maven;2.通過idea;3.通過sbt的方式;本文就每種方法通過圖文并茂的形式給大家詳細介紹,需要的朋友參考下吧
    2021-07-07
  • javaWeb實現(xiàn)學(xué)生信息管理系統(tǒng)

    javaWeb實現(xiàn)學(xué)生信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了javaWeb實現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • RabbitMQ基礎(chǔ)概念之信道channel詳解

    RabbitMQ基礎(chǔ)概念之信道channel詳解

    這篇文章主要介紹了RabbitMQ基礎(chǔ)概念之信道channel詳解,信道是生產(chǎn)消費者與rabbit通信的渠道,生產(chǎn)者publish或者消費者消費一個隊列都是需要通過信道來通信的,需要的朋友可以參考下
    2023-08-08
  • Spring AOP使用之多切面運行順序

    Spring AOP使用之多切面運行順序

    這篇文章主要介紹了Spring AOP使用之多切面運行順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java基礎(chǔ)篇之List集合舉例詳解

    Java基礎(chǔ)篇之List集合舉例詳解

    Java中的List集合是一種常用的數(shù)據(jù)結(jié)構(gòu),它提供了一種有序、可重復(fù)的元素集合,下面這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)篇之List集合的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • Java設(shè)計模式以虹貓藍兔的故事講解裝飾器模式

    Java設(shè)計模式以虹貓藍兔的故事講解裝飾器模式

    裝飾器模式又名包裝(Wrapper)模式。裝飾器模式以對客戶端透明的方式拓展對象的功能,是繼承關(guān)系的一種替代方案,本篇文章以虹貓藍兔生動形象的為你帶來詳細講解
    2022-04-04

最新評論

开鲁县| 华容县| 中山市| 大港区| 南城县| 卓尼县| 通海县| 定兴县| 哈巴河县| 赫章县| 玛沁县| 榕江县| 饶阳县| 隆化县| 博客| 大安市| 桦甸市| 紫云| 特克斯县| 咸阳市| 南投市| 曲水县| 岚皋县| 政和县| 介休市| 洛隆县| 建阳市| 静海县| 石首市| 家居| 富平县| 密山市| 铜川市| 无棣县| 句容市| 屏东市| 嘉定区| 景洪市| 古丈县| 乌兰县| 佳木斯市|