0
点赞
收藏
分享

微信扫一扫

Spring boot同步锁

静守幸福 2022-02-23 阅读 51
  • 环境

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

举报

相关推荐

0 条评论