public synchronized OrderBOResult addOrder(OrderParam orderParam)
一般来说这样加锁可以保证 同一时间只有一个线程能使用这个方法,但是如果这样做 直接导致了 一个多线程项目变成了 一个单线程项目
所有我们可以 用一个常量来保证只有相同String 的请求才会 被锁
private static final Interner<String> pool = Interners.newWeakInterner();
@ApiOperation("接单")
@ApiResponses({
@ApiResponse(code = 200, message = "OK", response = AppUser.class)
})
@AvoidRepeatableCommit
@PostMapping("/doDeviceOrder")
public Ajax doDeviceOrder(@Validated DoDeviceOrderDto dto) {
try {
deviceOrderService.idCard(getCurrentUser().getId());
synchronized (pool.intern(dto.getOrderNo())){
return deviceOrderService.doDeviceOrder(dto, getCurrentUser());
}
} catch (Exception e) {
e.printStackTrace();
logger.error(e.getMessage());
return Ajax.faild(e.getMessage());
}
}
synchronized块锁住不同对象的时候,同步块里是不会阻塞的。
但是这种是单机部署才可以是用的如果你是集群部署 则需要使用 redis 的分布式锁
redisTemplate.opsForValue().setIfAbsent("key","value",timeout,unit); 分布式锁
部分参考博客:https://www.cnblogs.com/fswhq/p/11260896.html