双重检测锁

双重检测锁

1、 首先,一听这个名称的时候,我是一脸茫然,下面我就来介绍一下今天学习双重检测锁的收获 吧,今天在在写代码的时候遇到一个高并发的情况,就是我写的接口如果同时有一万个人同时访问得话,那么公司的系统能不能承受的住的这么大的压力呢?
一开始想到是直接在方法上加锁synchronized,这是最简单的方法。例如:

@GetMapping("/")
public synchronized List<Salary> getAllSalarys(){
        return salaryService.getAllSalarys();
}

在方法名上加锁的意思是,每次我只允许一个线程去访问,如果线程在运行中那就一次等待。
2、使用双重检测锁

    public List<Student> getAllStudent() {
        redisTemplate.setKeySerializer(keyRedisSerializer);      
        //在高并发条件下,会出现缓存穿透
        List<Student> studentList = (List<Student>)redisTemplate.opsForValue().get("allStudent");
        if (null == studentList) {
            //10000个人, 9999个等,1个进入
            synchronized (this) {
    //双重检测锁,假使同时有5个请求进入了上一个if(null == studentList),加了锁之后one by one 的访问,这里再次对缓存进行检测,尽一切可能防止缓存穿透的产生,但是性能会有所损失
                studentList = (List<Student>)redisTemplate.opsForValue().get("allStudent");
                if (null == studentList) {
                    studentList = studentMapper.getAllStudent();
                    redisTemplate.opsForValue().set("allStudent", studentList);
   
                } 
            }
        }
        return studentList;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值