使用String常量作为synchronized的锁 优化同步锁

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

原文地址:https://www.cnblogs.com/kyousuke/p/14597503.html