java 多线程 加法_Java,在多线程中使用长加法器时得到错误值

我正在做这个练习:

生成1000个线程,每个线程递增一个计数器

十万次。使用原子长的性能比较

对长加得。

以下是我的实现:

import java.io.*;

import java.util.*;

import java.nio.file.*;

import java.util.concurrent.*;

import java.util.concurrent.atomic.*;

public class AtomicLongVsLongAddr {

// 9. Generate 1,000 threads, each of which increments a counter

// 100,000 times. Compare the performance of using AtomicLong

// versus LongAdder.

AtomicLong al = new AtomicLong(0);

LongAdder la = new LongAdder();

public class AtomicLongThread extends Thread {

@Override

public void run() {

for (int i = 0; i < 100000; i ++) {

al.incrementAndGet();

}

}

}

public class LongAdderThread extends Thread {

@Override

public void run() {

for (int i = 0; i < 100000; i ++) {

la.increment();

}

}

}

public static void main(String[] args) {

AtomicLongVsLongAddr vs = new AtomicLongVsLongAddr();

long startTime = System.currentTimeMillis();

for (int i = 0; i < 1000; i ++) {

(vs.new AtomicLongThread()).start();

}

long endTime = System.currentTimeMillis();

System.out.printf("AtomicLong--Number: %s, Time: %d\n", vs.al, endTime - startTime);

startTime = System.currentTimeMillis();

for (int i = 0; i < 1000; i ++) {

(vs.new LongAdderThread()).start();

}

long res = vs.la.sum();

endTime = System.currentTimeMillis();

System.out.printf("LongAdder--Number: %s, Time: %d\n", res, endTime - startTime);

}

}

每次运行此程序时,我都会得到如下标准输出:

AtomicLong--Number: 100000000, Time: 2330

LongAdder--Number: 99882179, Time: 469

显然我用longadder得到了一个错误的值,但是我不知道我做错了什么。

你能帮助我吗?

更新

在在座各位和@ravindra ranwala的帮助下,我更新了我对上述练习的答案:

import java.io.*;

import java.util.*;

import java.nio.file.*;

import java.util.concurrent.*;

import java.util.concurrent.atomic.*;

public class AtomicLongVsLongAddr {

// 9. Generate 1,000 threads, each of which increments a counter

// 100,000 times. Compare the performance of using AtomicLong

// versus LongAdder.

AtomicLong al = new AtomicLong(0);

LongAdder la = new LongAdder();

public class AtomicLongThread extends Thread {

@Override

public void run() {

for (int i = 0; i < 100000; i ++) {

al.incrementAndGet();

}

}

}

public class LongAdderThread extends Thread {

@Override

public void run() {

for (int i = 0; i < 100000; i ++) {

la.increment();

}

}

}

public static void main(String[] args) {

try{

long startTime;

long endTime;

AtomicLongVsLongAddr vs = new AtomicLongVsLongAddr();

Thread[] t = new Thread[1000];

for (int i = 0; i < 1000; i ++) {

t[i] = vs.new AtomicLongThread();

}

startTime = System.currentTimeMillis();

for (int i = 0; i < 1000; i ++) {

t[i].start();

t[i].join();

}

endTime = System.currentTimeMillis();

System.out.printf("AtomicLong--Number: %s, Time: %d\n", vs.al, endTime - startTime);

for (int i = 0; i < 1000; i ++) {

t[i] = vs.new LongAdderThread();

}

startTime = System.currentTimeMillis();

for (int i = 0; i < 1000; i ++) {

t[i].start();

t[i].join();

}

long res = vs.la.sum();

endTime = System.currentTimeMillis();

System.out.printf("LongAdder--Number: %s, Time: %d\n", res, endTime - startTime);

} catch (Exception e) {

e.printStackTrace();

}

}

}

如果还有错误,请为我指出。谢谢大家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值