threadTotal = 1 和threadTotal = 200;的并发情况出现5000的概率

来源:1-3 并发编程初体验

互联网的搬运工

2018-03-18

public class CountExample1 {
	
	private static final Logger log = Logger.getLogger(CountExample1.class);
	
	// 请求总数
	public static int clientTotal = 5000;
	// 同时并发执行的线程数
	public static int threadTotal = 1;
	
	public static long count = 0;
	
	public static void main(String[] args) {
		ExecutorService executorService = Executors.newCachedThreadPool();
		final Semaphore semaphore = new Semaphore(threadTotal); // 同时申请200个请求
		for (int i = 0; i < clientTotal; i++) {
			executorService.execute(new Runnable() {
				
				@Override
				public void run() {
					try {
						semaphore.acquire();// 申请一个许可
						add();
						semaphore.release(); // 释放一个许可
					} catch (InterruptedException e) {
						 log.error("exception", e);
					} 
				}
			});
		}
		executorService.shutdown();
		log.info("count:" + count);
	}

	private static void add() {
		count++ ;
	}
	


写回答

1回答

Jimin

2018-03-18

你好,这里就是个模拟并发的场景,要表达的就是如果不做些特殊的处理,结果会有问题。这个的解决方法很多,在课程的原子性章节会有具体解答。如果你着急想看一下正确的结果,可以给add那个方法加上一个关键字synchronized,或者使用atomicInteger代替普通的Integer类做累加操作,但语法需要做相关等我调整,原子性那种可以重点关注。这里体验的例子,课程实际讲解部分会进行实际解决。祝你学习愉快~

0
3
Jimin
回复
文刀文武
那你看一下你的 executorService.shutdown();位置是否正确
2019-12-21
共3条回复

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

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

3923 学习 · 832 问题

查看课程