3-1节count类型改为AtomicInteger,执行结果不为5000啊

来源:3-1 线程安全性-原子性-atomic-1

慕无忌9453660

2018-11-11

执行结果并不是每次都是5000,也有不是5000的啊,求解???
代码如下:
@Slf4j
@ThreadSafe
public class CountExample2 {

// 请求总数
public static int clientTotal = 5000;

// 同时并发执行的线程数
public static int threadTotal = 200;

// 计数
public static AtomicInteger count = new AtomicInteger(0);

public static void main(String[] args) throws Exception{
    ExecutorService executorService = Executors.newCachedThreadPool();
    final Semaphore semaphore = new Semaphore(threadTotal);
    final CountDownLatch countDownLatch = new CountDownLatch(threadTotal);
    for (int i = 0; i < clientTotal ; i++) {
        executorService.execute(() ->{
                    try {
                        semaphore.acquire();
                        add();
                        semaphore.release();
                    }catch (Exception e){
                        log.error("Exception: " + e);
                    }
            countDownLatch.countDown();
        });
    }
    countDownLatch.await();
    executorService.shutdown();
    log.info("count: " + count.get() );
}

private static void add(){
    count.incrementAndGet();
    //count.getAndIncrement();
}

}

写回答

1回答

Jimin

2018-11-11

CountDownLatch countDownLatch = new CountDownLatch(threadTotal);

应该改为:

CountDownLatch countDownLatch = new CountDownLatch(clientTotal);

代表CountDownLatch要减少5000次,目前只减少200次,相当于还没完全执行完就打印了count,因此结果是错的。

0
1
慕无忌9453660
非常感谢!
2018-11-13
共1条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程