题目:
当前200个用户同时发起请求,共接收5000个请求,每次请求add操作,count++。
代码:
@Slf4j
public class CountExample {
// 请求总数
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++ ;
}
}
分析:
在threadTotal = 1或者threadTotal = 200时,牵着每次执行结果都不一样,后者都是为5000。
对于简单的累加操作,5000个线程同一时间只有一个进程执行和200个进程执行时不一样的!
类似我们本地模拟式一个进程,怎么模拟都是对的,一旦上线就会出错,此时我们就要考虑是否是并发问题!
并发模拟:
- PostMan:Http请求模拟工具
- Apache Bench(AB):Apache附带的工具,测试网站性能
- JMeter:Apache组织开发的压力测试工具
其他资料: