成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java并發(fā)編程包中atomic的實(shí)現(xiàn)原理

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

 這是一篇來(lái)自粉絲的投稿,作者【林灣村龍貓】最近在閱讀Java源碼,這一篇是他關(guān)于并發(fā)包中atomic類(lèi)的源碼閱讀的總結(jié)。Hollis做了一點(diǎn)點(diǎn)修改。

引子

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

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

使用例子

  1. import java.util.concurrent.CountDownLatch; 
  2. import java.util.concurrent.atomic.AtomicInteger; 
  3.  
  4. public class App { 
  5.  
  6.     public static void main(String[] args) throws Exception { 
  7.         CountDownLatch countDownLatch = new CountDownLatch(100); 
  8.  
  9.         AtomicInteger atomicInteger = new AtomicInteger(0); 
  10.         for (int i = 0; i < 100; i++) { 
  11.             new Thread() { 
  12.                 @Override 
  13.                 public void run() { 
  14.                     atomicInteger.getAndIncrement(); 
  15.  
  16.                     countDownLatch.countDown(); 
  17.                 } 
  18.             }.start(); 
  19.         } 
  20.  
  21.         countDownLatch.await(); 
  22.  
  23.         System.out.println(atomicInteger.get()); 
  24.     } 

在以上代碼中,使用AtomicInteger聲明了一個(gè)全局變量,并且在多線(xiàn)程中進(jìn)行自增,代碼中并沒(méi)有進(jìn)行顯示的加鎖。

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

也就說(shuō)明AtomicInteger聲明的變量,在多線(xiàn)程場(chǎng)景中的自增操作是可以保證線(xiàn)程安全的。接下來(lái)我們分析下其原理。

原理

我們可以看一下AtomicInteger的代碼

他的值是存在一個(gè)volatile的int里面。volatile只能保證這個(gè)變量的可見(jiàn)性。不能保證他的原子性。

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

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

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

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

優(yōu)缺點(diǎn)

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

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

Java 8做出的改進(jìn)和努力

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

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

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

大概就是當(dāng)競(jìng)爭(zhēng)不激烈的時(shí)候,所有線(xiàn)程都是通過(guò)CAS對(duì)同一個(gè)變量(Base)進(jìn)行修改,當(dāng)競(jìng)爭(zhēng)激烈的時(shí)候,會(huì)將根據(jù)當(dāng)前線(xiàn)程哈希到對(duì)于Cell上進(jìn)行修改(多段鎖)。

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

【本文是51CTO專(zhuān)欄作者Hollis的原創(chuàng)文章,作者微信公眾號(hào)Hollis(ID:hollischuang)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2025-03-20 06:48:55

性能優(yōu)化JDK

2023-12-01 08:54:50

Java原子類(lèi)型

2023-12-04 13:48:00

編 程Atomic

2023-07-05 08:18:54

Atomic類(lèi)樂(lè)觀(guān)鎖悲觀(guān)鎖

2021-06-07 17:12:22

線(xiàn)程安全Atomic

2021-08-05 07:58:22

并發(fā)編程包Task

2020-12-04 19:28:53

CountDownLaPhaserCyclicBarri

2020-12-03 11:15:21

CyclicBarri

2020-11-30 16:01:03

Semaphore

2020-12-09 08:21:47

編程Exchanger工具

2020-12-16 10:54:52

編程ForkJoin框架

2022-11-09 09:01:08

并發(fā)編程線(xiàn)程池

2019-09-16 08:45:53

并發(fā)編程通信

2012-06-17 12:49:03

并發(fā)并發(fā)編程

2021-12-27 10:13:51

Goatomic數(shù)據(jù)競(jìng)爭(zhēng)

2024-01-29 10:34:37

Java編程

2022-03-02 08:20:54

并發(fā)編程java后端開(kāi)發(fā)

2022-12-26 09:27:48

Java底層monitor

2017-09-19 14:53:37

Java并發(fā)編程并發(fā)代碼設(shè)計(jì)

2020-09-22 12:00:23

Javahashmap高并發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 成人免费淫片aa视频免费 | 自拍偷拍亚洲欧美 | 国产美女精品视频 | 亚洲最大福利网 | 狠狠做深爱婷婷综合一区 | 国产激情一区二区三区 | 香蕉一区二区 | 国产一区二区三区久久久久久久久 | 日韩有码一区 | 久久久久国产精品午夜一区 | 91 在线 | 日本中文字幕在线观看 | 奇米久久久 | www亚洲一区 | 激情黄色在线观看 | 亚洲不卡一 | 亚洲天堂精品一区 | 一级片视频免费观看 | 亚洲综合小视频 | 在线国产一区二区 | 黄色在线观看 | 视频一区在线 | 狠狠视频 | 尤物在线精品视频 | 欧美精品日韩精品国产精品 | 亚洲一区二区三区在线免费观看 | 日韩在线小视频 | 亚洲国产aⅴ精品 | 日韩成人在线观看 | 日韩精品一区二 | 亚洲性视频网站 | 99免费| 欧美黑人一区二区三区 | 麻豆久久久9性大片 | 日韩精品在线观看一区二区 | 国产乱码久久久久久一区二区 | 亚洲国产精品网站 | 日韩欧美手机在线 | 精品国产免费人成在线观看 | 亚洲高清在线免费观看 | 久久网一区二区三区 |