RedisAtomicInteger 从名字上来说就是 redis 的原子Integer 数据类型,由于其原子性,, 可用于秒杀活动物品数量的控制。
以及保证顺序生成数字。
下面示例:创建了100个线程的线程池子,submit 中的代码 相当于在一个线程的 run 方法中持续执行,
外面for 循环100 次,就是往线程池提交 100 次任务
@Autowired
private RedisTemplate redisTemplate;
@RequestMapping("/testRedisAtomicInteger")
@ResponseBody
public Object testRedisAtomicInteger() {
String ticketName = "testRedisAtomicInteger";
RedisAtomicInteger redisCount = new RedisAtomicInteger(ticketName,redisTemplate.getConnectionFactory());
// 创建 100 个线程 并发执行 increment 操作
ExecutorService pool = Executors.newFixedThreadPool(100);
for (int i = 0; i < 100; i++) {
pool.submit(() -> {
// 配额码原子变量值增加,每次增加1
for (int j = 0; j < 100; j++) {
int count = redisCount.incrementAndGet();
System.out.println(Thread.currentThread().getName()+": " +count);
}
});
}
return redisCount;
}
输出结果
。。。。
pool-2-thread-63: 9977
pool-2-thread-25: 9978
pool-2-thread-86: 9974
pool-2-thread-12: 9980
pool-2-thread-3: 9979
pool-2-thread-61: 9981
pool-2-thread-63: 9982
pool-2-thread-25: 9984
pool-2-thread-90: 9983
pool-2-thread-12: 9985
pool-2-thread-25: 9988
pool-2-thread-90: 9989
pool-2-thread-61: 9987
pool-2-thread-3: 9986
pool-2-thread-12: 9990
pool-2-thread-25: 9991
pool-2-thread-90: 9992
pool-2-thread-12: 9994
pool-2-thread-61: 9993
pool-2-thread-25: 9995
pool-2-thread-12: 9996
pool-2-thread-61: 9997
pool-2-thread-25: 9998
pool-2-thread-12: 9999
pool-2-thread-61: 10000
打印结果肯定不是顺序输出 1~ 10000,因为这里有 100个线程并发输出,但是不会出现重复的数字。