感觉像是老师故意设计的,有个很明显的线程安全问题是,当同一个用户由于并发量比较高的情况下,部分用户通过【是否重复购票】验证,直接进入抢锁入口,是否需要在锁住的资源层面,进行再次【是否重复购票】验证
try {
// Redisson 分布式锁处理
boolean isLocked = lock.tryLock(expireTime, TimeUnit.MILLISECONDS);
if (isLocked) {
AssertUtil.isTrue(voucherOrdersMapper.findDinerOrder(dinerInfo.getId(),
seckillVouchers.getFkVoucherId()) != null, "该用户已抢到该代金券,无需再抢");
// 下单
VoucherOrders voucherOrders = new VoucherOrders();
voucherOrders.setFkDinerId(dinerInfo.getId());
...
}