首页 > 其他 > 详细

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

时间:2021-03-30 20:24:19      阅读:18      评论:0      收藏:0      [点我收藏+]
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

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!