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

Java中對AtomicInteger和int值在多線程下遞增操作的測試

 更新時間:2014年09月19日 09:56:12   投稿:junjie  
這篇文章主要介紹了Java中對AtomicInteger和int值在多線程下遞增操作的測試,本文得出AtomicInteger操作 與 int操作的效率大致相差在50-80倍上下的結(jié)論,需要的朋友可以參考下

Java針對多線程下的數(shù)值安全計數(shù)器設(shè)計了一些類,這些類叫做原子類,其中一部分如下:

java.util.concurrent.atomic.AtomicBoolean;
java.util.concurrent.atomic.AtomicInteger;
java.util.concurrent.atomic.AtomicLong;
java.util.concurrent.atomic.AtomicReference;

下面是一個對比  AtomicInteger 與 普通 int 值在多線程下的遞增測試,使用的是 junit4;

完整代碼:

package test.java;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

/**
 * 測試AtomicInteger與普通int值在多線程下的遞增操作
 */
public class TestAtomic {

 // 原子Integer遞增對象
 public static AtomicInteger counter_integer;// = new AtomicInteger(0);
 // 一個int類型的變量
 public static int count_int = 0;

 @Before
 public void setUp() {
 // 所有測試開始之前執(zhí)行初始設(shè)置工作
 counter_integer = new AtomicInteger(0);
 }

 @Test
 public void testAtomic() throws InterruptedException {
 // 創(chuàng)建的線程數(shù)量
 int threadCount = 100;
 // 其他附屬線程內(nèi)部循環(huán)多少次
 int loopCount = 10000600;
 // 控制附屬線程的輔助對象;(其他await的線程先等著主線程喊開始)
 CountDownLatch latch_1 = new CountDownLatch(1);
 // 控制主線程的輔助對象;(主線程等著所有附屬線程都運行完畢再繼續(xù))
 CountDownLatch latch_n = new CountDownLatch(threadCount);
 // 創(chuàng)建并啟動其他附屬線程
 for (int i = 0; i < threadCount; i++) {
  Thread thread = new AtomicIntegerThread(latch_1, latch_n, loopCount);
  thread.start();
 }
 long startNano = System.nanoTime();
 // 讓其他等待的線程統(tǒng)一開始
 latch_1.countDown();
 // 等待其他線程執(zhí)行完
 latch_n.await();
 //

 long endNano = System.nanoTime();
 int sum = counter_integer.get();
 //
 Assert.assertEquals("sum 不等于 threadCount * loopCount,測試失敗",
  sum, threadCount * loopCount);
 System.out.println("--------testAtomic(); 預(yù)期兩者相等------------");
 System.out.println("耗時: " + ((endNano - startNano) / (1000 * 1000)) + "ms");
 System.out.println("threadCount = " + (threadCount) + ";");
 System.out.println("loopCount = " + (loopCount) + ";");
 System.out.println("sum = " + (sum) + ";");
 }

 @Test
 public void testIntAdd() throws InterruptedException {
 // 創(chuàng)建的線程數(shù)量
 int threadCount = 100;
 // 其他附屬線程內(nèi)部循環(huán)多少次
 int loopCount = 10000600;
 // 控制附屬線程的輔助對象;(其他await的線程先等著主線程喊開始)
 CountDownLatch latch_1 = new CountDownLatch(1);
 // 控制主線程的輔助對象;(主線程等著所有附屬線程都運行完畢再繼續(xù))
 CountDownLatch latch_n = new CountDownLatch(threadCount);
 // 創(chuàng)建并啟動其他附屬線程
 for (int i = 0; i < threadCount; i++) {
  Thread thread = new IntegerThread(latch_1, latch_n, loopCount);
  thread.start();
 }
 long startNano = System.nanoTime();
 // 讓其他等待的線程統(tǒng)一開始
 latch_1.countDown();
 // 等待其他線程執(zhí)行完
 latch_n.await();
 //
 long endNano = System.nanoTime();
 int sum = count_int;
 //
 Assert.assertNotEquals(
  "sum 等于 threadCount * loopCount,testIntAdd()測試失敗", 
  sum, threadCount * loopCount);
 System.out.println("-------testIntAdd(); 預(yù)期兩者不相等---------");
 System.out.println("耗時: " + ((endNano - startNano) / (1000*1000))+ "ms");
 System.out.println("threadCount = " + (threadCount) + ";");
 System.out.println("loopCount = " + (loopCount) + ";");
 System.out.println("sum = " + (sum) + ";");
 }

 // 線程
 class AtomicIntegerThread extends Thread {
 private CountDownLatch latch = null;
 private CountDownLatch latchdown = null;
 private int loopCount;

 public AtomicIntegerThread(CountDownLatch latch,
  CountDownLatch latchdown, int loopCount) {
  this.latch = latch;
  this.latchdown = latchdown;
  this.loopCount = loopCount;
 }

 @Override
 public void run() {
  // 等待信號同步
  try {
  this.latch.await();
  } catch (InterruptedException e) {
  e.printStackTrace();
  }
  //
  for (int i = 0; i < loopCount; i++) {
  counter_integer.getAndIncrement();
  }
  // 通知遞減1次
  latchdown.countDown();
 }
 }

 // 線程
 class IntegerThread extends Thread {
 private CountDownLatch latch = null;
 private CountDownLatch latchdown = null;
 private int loopCount;

 public IntegerThread(CountDownLatch latch, 
  CountDownLatch latchdown, int loopCount) {
  this.latch = latch;
  this.latchdown = latchdown;
  this.loopCount = loopCount;
 }

 @Override
 public void run() {
  // 等待信號同步
  try {
  this.latch.await();
  } catch (InterruptedException e) {
  e.printStackTrace();
  }
  //
  for (int i = 0; i < loopCount; i++) {
  count_int++;
  }
  // 通知遞減1次
  latchdown.countDown();
 }
 }
}

普通PC機上的執(zhí)行結(jié)果類似如下:

--------------testAtomic(); 預(yù)期兩者相等-------------------
耗時: 85366ms
threadCount = 100;
loopCount = 10000600;
sum = 1000060000;
--------------testIntAdd(); 預(yù)期兩者不相等-------------------
耗時: 1406ms
threadCount = 100;
loopCount = 10000600;
sum = 119428988;

從中可以看出, AtomicInteger操作 與 int操作的效率大致相差在50-80倍上下,當(dāng)然,int很不消耗時間,這個對比只是提供一個參照。

如果確定是單線程執(zhí)行,那應(yīng)該使用 int; 而int在多線程下的操作執(zhí)行的效率還是蠻高的, 10億次只花了1.5秒鐘;

 (假設(shè)CPU是 2GHZ,雙核4線程,理論最大8GHZ,則每秒理論上有80億個時鐘周期,

 10億次Java的int增加消耗了1.5秒,即 120億次運算, 算下來每次循環(huán)消耗CPU周期 12個;

個人覺得效率不錯, C 語言也應(yīng)該需要4個以上的時鐘周期(判斷,執(zhí)行內(nèi)部代碼,自增判斷,跳轉(zhuǎn))

 前提是: JVM和CPU沒有進行激進優(yōu)化.

)

而 AtomicInteger 效率其實也不低,10億次消耗了80秒, 那100萬次大約也就是千分之一,80毫秒的樣子.

相關(guān)文章

  • 使用Spring boot 的profile功能實現(xiàn)多環(huán)境配置自動切換

    使用Spring boot 的profile功能實現(xiàn)多環(huán)境配置自動切換

    這篇文章主要介紹了使用Spring boot 的profile功能實現(xiàn)多環(huán)境配置自動切換的相關(guān)知識,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2018-11-11
  • 如何為Logback日志添加唯一追蹤ID

    如何為Logback日志添加唯一追蹤ID

    本文介紹了如何為Logback日志添加唯一追蹤ID,以便在測試和調(diào)試時更容易定位報錯信息,通過創(chuàng)建過濾器和修改配置文件,可以在每個請求的日志中添加唯一的ID,并將其返回給前端,這樣,當(dāng)用戶反饋報錯時,開發(fā)人員可以根據(jù)ID快速定位和解決問題
    2024-12-12
  • SpringBoot4.5.2 整合HikariCP 數(shù)據(jù)庫連接池操作

    SpringBoot4.5.2 整合HikariCP 數(shù)據(jù)庫連接池操作

    這篇文章主要介紹了SpringBoot4.5.2 整合HikariCP 數(shù)據(jù)庫連接池操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot Admin健康檢查功能的實現(xiàn)

    SpringBoot Admin健康檢查功能的實現(xiàn)

    admin主要就是告訴運維人員,服務(wù)出現(xiàn)異常,然后進行通知(微信、郵件、短信、釘釘?shù)龋┛梢苑浅?焖偻ㄖ竭\維人員,相當(dāng)報警功能,接下來通過本文給大家介紹SpringBoot Admin健康檢查的相關(guān)知識,一起看看吧
    2021-06-06
  • 淺談spring中的default-lazy-init參數(shù)和lazy-init

    淺談spring中的default-lazy-init參數(shù)和lazy-init

    下面小編就為大家?guī)硪黄獪\談spring中的default-lazy-init參數(shù)和lazy-init。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Java字符串?dāng)?shù)字左右補全0的四種方式

    Java字符串?dāng)?shù)字左右補全0的四種方式

    這篇文章主要給大家介紹了關(guān)于Java字符串?dāng)?shù)字左右補全0的四種方式,在編程中有時候我們需要對一個字符串進行字符填充,以滿足某些特定的要求,其中補全0是一種常見的需求,需要的朋友可以參考下
    2023-08-08
  • Java中的注解、元注解詳細解析

    Java中的注解、元注解詳細解析

    這篇文章主要介紹了Java中的注解、元注解詳細解析,注解也叫元數(shù)據(jù),與類、接口、枚舉是在同一個層次,它可以聲明在包、類、字段、方法、局部變量、方法參數(shù)等的前面,用來對這些元素進行說明,注釋,需要的朋友可以參考下
    2023-11-11
  • 詳解spring cloud整合Swagger2構(gòu)建RESTful服務(wù)的APIs

    詳解spring cloud整合Swagger2構(gòu)建RESTful服務(wù)的APIs

    這篇文章主要介紹了詳解spring cloud整合Swagger2構(gòu)建RESTful服務(wù)的APIs,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Java日常練習(xí)題,每天進步一點點(3)

    Java日常練習(xí)題,每天進步一點點(3)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • IDEA 2020.3.X 創(chuàng)建scala環(huán)境的詳細教程

    IDEA 2020.3.X 創(chuàng)建scala環(huán)境的詳細教程

    這篇文章主要介紹了IDEA 2020.3.X 創(chuàng)建scala環(huán)境的詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04

最新評論

红安县| 大冶市| 太仓市| 安庆市| 辉县市| 安阳县| 江华| 资中县| 南华县| 长兴县| 东光县| 巢湖市| 南川市| 来安县| 二手房| 榆树市| 宝清县| 杨浦区| 宜兰市| 昌江| 曲阜市| 商河县| 上高县| 高台县| 福海县| 门源| 蒲城县| 加查县| 山阳县| 柘城县| 重庆市| 临高县| 石柱| 新龙县| 和田县| 高青县| 嘉义市| 邵武市| 凉山| 南阳市| 泾阳县|