欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

線程安全:

當多個線程訪問某個類時,不管運行時環(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)操作,有著一些性能的提升。但同時引入自旋,當鎖競爭較大的時候,自旋次數(shù)會增多。cpu資源會消耗很高。

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

Java 8做出的改進和努力

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

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

Atomic*遇到的問題是,只能運用于低并發(fā)場景。因此LongAddr在這基礎上引入了分段鎖的概念。可以參考《JDK8系列之LongAdder解析》一起看看做了什么。

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

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

總結(jié)

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

相關文章

  • 使用SpringJPA?直接實現(xiàn)count(*)

    使用SpringJPA?直接實現(xiàn)count(*)

    這篇文章主要介紹了SpringJPA?直接實現(xiàn)count(*),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java中的事件處理機制詳解

    Java中的事件處理機制詳解

    這篇文章主要介紹了Java中的事件處理機制詳解,Java事件處理是采取"委派事件模型",當事件發(fā)生時,產(chǎn)生事件的對象,會把此"信息"傳遞給"事件的監(jiān)聽者"處理,這里所說的"信息"實際上就是java.awt.event事件類庫里某個類創(chuàng)建對象,把它稱為"事件的對象",需要的朋友可以參考下
    2023-10-10
  • Java 控制流程、大數(shù)值、數(shù)組

    Java 控制流程、大數(shù)值、數(shù)組

    這篇文章主要給大家介紹的是Java 控制流程、大數(shù)值、數(shù)組的一些相關自來哦,感興趣的小伙伴可以參考下面文章的具體內(nèi)容,希望文章對你有所幫助
    2021-10-10
  • Java設計模式之單例模式實例詳解【懶漢式與餓漢式】

    Java設計模式之單例模式實例詳解【懶漢式與餓漢式】

    這篇文章主要介紹了Java設計模式之單例模式,簡單說明了單例模式的原理并結(jié)合具體實例形式分析了單例模式中懶漢式與餓漢式的具體實現(xiàn)與使用技巧,需要的朋友可以參考下
    2017-09-09
  • SpringBoot發(fā)送短信驗證碼的實例

    SpringBoot發(fā)送短信驗證碼的實例

    第三方短信發(fā)送平臺有很多種,各個平臺有各自的優(yōu)缺點,在選擇的時候可以根據(jù)自己的具體實際情況定奪,本文主要介紹了SpringBoot發(fā)送短信驗證碼的實例,感興趣的可以了解一下
    2022-02-02
  • Java如何使用itext向PDF插入數(shù)據(jù)和圖片

    Java如何使用itext向PDF插入數(shù)據(jù)和圖片

    最近項目中使用到Java實現(xiàn)寫入PDF文件,這篇文章主要給大家介紹了關于Java如何使用itext向PDF插入數(shù)據(jù)和圖片的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • 淺談java的守護線程與非守護線程

    淺談java的守護線程與非守護線程

    這篇文章主要介紹了淺談java的守護線程與非守護線程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • spring boot 與kafka集成的示例代碼

    spring boot 與kafka集成的示例代碼

    這篇文章主要介紹了spring boot 與kafka集成的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Java實現(xiàn)excel大數(shù)據(jù)量導入

    Java實現(xiàn)excel大數(shù)據(jù)量導入

    這篇文章主要為大家詳細介紹了Java實現(xiàn)excel大數(shù)據(jù)量導入,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • Java設計模式之策略模式示例詳解

    Java設計模式之策略模式示例詳解

    這篇文章主要為大家詳細介紹了Java的策略模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03

最新評論