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