国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

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

2019-11-26 15:25:32
字體:
供稿:網(wǎng)友

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); // 控制主線程的輔助對象;(主線程等著所有附屬線程都運(yùn)行完畢再繼續(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); // 控制主線程的輔助對象;(主線程等著所有附屬線程都運(yùn)行完畢再繼續(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機(jī)上的執(zhí)行結(jié)果類似如下:

--------------testAtomic(); 預(yù)期兩者相等-------------------耗時: 85366msthreadCount = 100;loopCount = 10000600;sum = 1000060000;--------------testIntAdd(); 預(yù)期兩者不相等-------------------耗時: 1406msthreadCount = 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億次運(yùn)算, 算下來每次循環(huán)消耗CPU周期 12個;

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

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

)

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 巢湖市| 基隆市| 忻城县| 正宁县| 陇南市| 德安县| 泉州市| 莲花县| 额敏县| 宿州市| 鄂伦春自治旗| 大新县| 宁远县| 揭东县| 米易县| 思茅市| 新巴尔虎右旗| 漳浦县| 凌源市| 佛冈县| 阿拉尔市| 乳山市| 剑阁县| 天长市| 兴城市| 宜州市| 汉沽区| 来宾市| 武冈市| 茌平县| 乌鲁木齐市| 蓬安县| 天全县| 阿图什市| 林口县| 历史| 齐河县| 临桂县| 金昌市| 新田县| 和硕县|