- 环境
window
springboot2.1.8
maven 3.5.7
jmeter5.2.1
- 没有同步锁的情况下并发
@GetMapping("/process/{orderId}")
public Map<String, Object> process(@PathVariable("orderId") String orederId){
log.info("[{}]开始",orederId);
service();
log.info("[{}]结束",orederId);
return R.ok();
}
- 结果显而易见–完全并发
- 初级同步锁情况
@GetMapping("/process/{orderId}")
public Map<String, Object> process(@PathVariable("orderId") String orederId){
synchronized (this){
log.info("[{}]开始",orederId);
service();
log.info("[{}]结束",orederId);
}
return R.ok();
}
- 看来达到了效果
- 不过如果超过springboot的tomcat线程数(200)最大数会怎样呢?
**看起来也达到了效果 **
但是这样下来并不是我们期待的结果 ,他只是简单的实现程序上的锁并没有实现真正的 同步锁
- 正确的做法是:
@GetMapping("/process/{orderId}")
public Map<String, Object> process(@PathVariable("orderId") String orederId){
// 锁住这一个对象orederId.intern()
synchronized (orederId.intern()){
log.info("[{}]开始",orederId);
service();
log.info("[{}]结束",orederId);
}
return R.ok();
}
- 我们也可以来缓存一些锁
Map<String,Object> mutexCache = new ConcurrentHashMap<>();
@GetMapping("/process/{orderId}")
public Map<String, Object> process(@PathVariable("orderId") String orederId){
mutexCache.computeIfAbsent(orederId,k -> new Object());
synchronized (mutexCache){
log.info("[{}]开始",orederId);
service();
log.info("[{}]结束",orederId);
}
return R.ok();
}
支持10000并发同步锁
来自抖音@程序员小山与Bug