国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java并發編程包中atomic的實現原理示例詳解

Java并發編程包中atomic的實現原理示例詳解

2021-05-31 13:58林灣村龍貓 Java教程

這篇文章主要給大家介紹了關于Java并發編程包中atomic的實現原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

線程安全:

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

線程安全主要體現在以下三個方面:

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

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

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

引子

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

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

使用例子

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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聲明了一個全局變量,并且在多線程中進行自增,代碼中并沒有進行顯示的加鎖。

以上代碼的輸出結果,永遠都是100。如果將atomicinteger換成integer,打印結果基本都是小于100。

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

原理

我們可以看一下atomicinteger的代碼

Java并發編程包中atomic的實現原理示例詳解

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

可以看看getandincrement這個類似i++的函數,可以發現,是調用了unsafe中的getandaddint。

Java并發編程包中atomic的實現原理示例詳解

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

進一步,我們可以發現實現方式:

Java并發編程包中atomic的實現原理示例詳解

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

優缺點

cas相對于其他鎖,不會進行內核態操作,有著一些性能的提升。但同時引入自旋,當鎖競爭較大的時候,自旋次數會增多。cpu資源會消耗很高。

換句話說,cas+自旋適合使用在低并發有同步數據的應用場景。

java 8做出的改進和努力

在java 8中引入了4個新的計數器類型,longadder、longaccumulator、doubleadder、doubleaccumulator。他們都是繼承于striped64。

在longadder 與atomiclong有什么區別?

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

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

Java并發編程包中atomic的實現原理示例詳解

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

總結

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

原文鏈接:http://zhuanlan.51cto.com/art/201809/583225.htm

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美一区二区三区视频 | 欧美一级做a爰片久久高潮 免费在线毛片 | 亚洲国产成人av | 国产成人精品一区二区三区网站观看 | 久久精品一区二区三区不卡牛牛 | 亚洲福利一区二区 | 亚洲 成人 一区 | 亚洲精品久久久 | 好吊色欧美一区二区三区四区 | 日本高清无卡码一区二区久久 | 国产福利在线观看 | 国产一区二区免费视频 | 日韩免费| 国产精品久久久久久久久久小说 | 99精品一区二区 | 中文字幕亚洲精品 | 国产v日产∨综合v精品视频 | 欧美精品一区二区三区一线天视频 | 精品国产乱码久久久久久久软件 | 久久国产精品久久久久久电车 | 日韩精品视频一区二区三区 | 九色网址| 久草在线视频网 | 天天澡天天狠天天天做 | 精品国产91久久 | 亚洲伦理一区二区 | 午夜午夜精品一区二区三区文 | 精品国产成人 | 日韩中文字幕一区二区 | 亚洲福利在线观看 | 久久久国产精品一区 | 欧美精品久久久 | 激情五月婷婷 | 国产午夜精品视频 | 中文字幕一区二区三区乱码在线 | 中文字幕 亚洲一区 | 日韩免费一区二区 | 午夜成人影视 | 欧美一级大片免费 | 国产精品久久久久久久久久妞妞 | 日韩在线一区二区三区 |