3-1节count类型改为AtomicInteger,执行结果不为5000啊
来源:3-1 线程安全性-原子性-atomic-1
![](http://img1.sycdn.imooc.com/user/5333a28f00019e7702100210-100-100.jpg)
慕无忌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回答
-
CountDownLatch countDownLatch = new CountDownLatch(threadTotal);
应该改为:
CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
代表CountDownLatch要减少5000次,目前只减少200次,相当于还没完全执行完就打印了count,因此结果是错的。
012018-11-13
相似问题