解决方案:
首先创建一个可重入锁,然后将业务代码块用锁包裹,最终释放锁
private final Lock lock = new ReentrantLock(); // 定义一个 ReentrantLock
加锁
//查询奖品列表 库存 减库存 加锁
lock.lock();
try {
//查询奖品列表排除 库存敏感 且 库存为0
//执行抽奖
//减库存
}finally {
lock.unlock();
}
压测:
创建线程池,设置好库存数量,以超过库存数量的并发请求测试
// 创建固定大小的线程池
ExecutorService executorService = Executors.newFixedThreadPool(threadCount);
使用lambda表达式执行线程任务
// 循环提交任务
for (int i = 0; i < threadCount; i++) {
final int index = i; // 将循环变量定义为 final
executorService.execute(() -> {
try {
//业务逻辑
func(i)
} catch (Exception e) {
e.printStackTrace();
}
});
}
// 关闭线程池
executorService.shutdown();