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

JDK8中新增的原子性操作類LongAdder詳解

 更新時間:2017年08月24日 10:53:36   作者:今天你不奮斗明天你就落后  
這篇文章主要給大家介紹了關(guān)于JDK8中新增的原子性操作類LongAdder的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

本文主要給大家介紹了關(guān)于JDK8新增的原子性操作類LongAdder的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹:

LongAdder簡單介紹

LongAdder類似于AtomicLong是原子性遞增或者遞減類,AtomicLong已經(jīng)通過CAS提供了非阻塞的原子性操作,相比使用阻塞算法的同步器來說性能已經(jīng)很好了,但是JDK開發(fā)組并不滿足,因為在非常高的并發(fā)請求下AtomicLong的性能不能讓他們接受,雖然AtomicLong使用CAS但是CAS失敗后還是通過無限循環(huán)的自旋鎖不斷嘗試的

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

在高并發(fā)下N多線程同時去操作一個變量會造成大量線程CAS失敗然后處于自旋狀態(tài),這大大浪費(fèi)了cpu資源,降低了并發(fā)性。那么既然AtomicLong性能由于過多線程同時去競爭一個變量的更新而降低的,那么如果把一個變量分解為多個變量,讓同樣多的線程去競爭多個資源那么性能問題不就解決了?是的,JDK8提供的LongAdder就是這個思路。下面通過圖形來標(biāo)示兩者不同。


如圖AtomicLong是多個線程同時競爭同一個變量。


如圖LongAdder則是內(nèi)部維護(hù)多個變量,每個變量初始化都0,在同等并發(fā)量的情況下,爭奪單個變量的線程量會減少這是變相的減少了爭奪共享資源的并發(fā)量,另外多個線程在爭奪同一個原子變量時候如果失敗并不是自旋CAS重試,而是嘗試獲取其他原子變量的鎖,最后獲取當(dāng)前值時候是把所有變量的值累加后返回的。

LongAdder維護(hù)了一個延遲初始化的原子性更新數(shù)組和一個基值變量base.數(shù)組的大小保持是2的N次方大小,數(shù)組表的下標(biāo)使用每個線程的hashcode值的掩碼表示,數(shù)組里面的變量實體是Cell類型,Cell類型是AtomicLong的一個改進(jìn),用來減少緩存的爭用,對于大多數(shù)原子操作字節(jié)填充是浪費(fèi)的,因為原子性操作都是無規(guī)律的分散在內(nèi)存中進(jìn)行的,多個原子性操作彼此之間是沒有接觸的,但是原子性數(shù)組元素彼此相鄰存放將能經(jīng)常共享緩存行,所以這在性能上是一個提升。

另外由于Cells占用內(nèi)存是相對比較大的,所以一開始并不創(chuàng)建,而是在需要時候在創(chuàng)建,也就是惰性加載,當(dāng)一開始沒有空間時候,所有的更新都是操作base變量,

自旋鎖cellsBusy用來初始化和擴(kuò)容數(shù)組表使用,這里沒有必要用阻塞鎖,當(dāng)一次線程發(fā)現(xiàn)當(dāng)前下標(biāo)的元素獲取鎖失敗后,會嘗試獲取其他下表的元素的鎖。更詳細(xì)的說明敬請期待 Java并發(fā)編程基礎(chǔ)之并發(fā)包源碼剖析 一書的出版

總結(jié)

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

相關(guān)文章

  • 淺談spring boot使用thymeleaf版本的問題

    淺談spring boot使用thymeleaf版本的問題

    這篇文章主要介紹了spring boot使用thymeleaf版本的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring MVC訪問靜態(tài)文件_動力節(jié)點(diǎn)Java學(xué)院整理

    Spring MVC訪問靜態(tài)文件_動力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了Spring MVC訪問靜態(tài)文件的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java實現(xiàn)調(diào)用ElasticSearch?API的示例詳解

    Java實現(xiàn)調(diào)用ElasticSearch?API的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Java調(diào)用ElasticSearch?API的效果資料,文中的示例代碼講解詳細(xì),具有一定的參考價值,感興趣的可以了解一下
    2023-03-03
  • Java SpringMVC的自定義異常類

    Java SpringMVC的自定義異常類

    這篇文章主要為大家詳細(xì)介紹了SpringMVC的自定義異常類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 深入了解Java接口回調(diào)機(jī)制

    深入了解Java接口回調(diào)機(jī)制

    這篇文章主要介紹了Java接口回調(diào)機(jī)制,下面我們來一起學(xué)習(xí)一下吧
    2019-05-05
  • 詳解springboot和vue前后端分離開發(fā)跨域登陸問題

    詳解springboot和vue前后端分離開發(fā)跨域登陸問題

    這篇文章主要介紹了詳解springboot和vue前后端分離開發(fā)跨域登陸問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Java?Web中ServletContext對象詳解與應(yīng)用

    Java?Web中ServletContext對象詳解與應(yīng)用

    ServletContext是一個容器,可以用來存放變量,供一個web項目中多個Servlet共享,下面這篇文章主要給大家介紹了關(guān)于Java?Web中ServletContext對象詳解與應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Spring注解@Transactional失效的場景分析

    Spring注解@Transactional失效的場景分析

    在使用Spring中事務(wù)注解@Transactional時會存在幾種場景下該注解失效,即不能按照預(yù)期封裝成一個事務(wù)操作,于是本文文將對該注解進(jìn)行學(xué)習(xí)并對相關(guān)失效場景進(jìn)行分析,需要的朋友可以參考下
    2023-07-07
  • Java遞歸造成的堆棧溢出問題及解決方案

    Java遞歸造成的堆棧溢出問題及解決方案

    在Java中,遞歸造成的堆棧溢出問題通常是因為遞歸調(diào)用的深度過大,導(dǎo)致調(diào)用??臻g不足,解決這類問題的一種常見方法是使用非遞歸的方式重寫算法,即使用迭代替代遞歸,需要的朋友可以參考下
    2024-08-08
  • SpringBoot實現(xiàn)文件上傳接口

    SpringBoot實現(xiàn)文件上傳接口

    這篇文章主要為大家詳細(xì)介紹了SpringBoot實現(xiàn)文件上傳接口,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11

最新評論

瑞金市| 五常市| 礼泉县| 浦江县| 青海省| 南召县| 洛阳市| 登封市| 泰宁县| 玉环县| 洪洞县| 伊宁市| 嘉黎县| 资阳市| 涟源市| 利辛县| 福清市| 辽中县| 同德县| 宜宾县| 连城县| 巴林左旗| 武义县| 屯门区| 忻城县| 武平县| 贺兰县| 恩平市| 北京市| 德州市| 克拉玛依市| 贡嘎县| 松江区| 普定县| 鄂尔多斯市| 三亚市| 太保市| 太仆寺旗| 襄城县| 靖远县| 彰武县|