高并发场景下锁的使用技巧(悲观锁/乐观锁/分布式锁)

如何确保一个方法,或者一块代码在高并发情况下,同一时间只能被一个线程执行,单体应用可以使用 Java 并发处理相关的 API 进行控制,但单体应用架构演变为分布式微服务架构后,跨 JVM 或者跨进程的实例部署,就没办法通过 Java 锁的机制来控制并发了。那有哪些锁可以使用?Java 中的重量级锁 synchronize、Java 中的轻量级锁和 CAS、数据库行锁、悲观锁、乐观锁、分布式锁,这些锁之间有什么区别呢?

讲师介绍

冯忠旗,京东数科高级架构师,全球软件开发大会讲师。2015~2018 年在宜信支付与结算中心担任支付结算平台技术负责人,2010~2014 年在 IBM CDL 中国研发中心担任 ITAAS 私有云 RingCloud 技术团队研发负责人。

精选留言(21)

  • ChenGuop
    2019-11-15
    补充一下,redis 分布式锁的误解锁过程,检验解锁的value值是否是同一个锁后,在进行删除,使用lua 脚本执行保证一致性!

    作者回复: 👍👍👍

    共 3 条评论
    7
  • Geek_e05a5e
    2019-11-15
    冯老师的每个分享都干货满满,刚好项目中有资金管理,先前的防止重复支付到这个锁的方案介绍,都深有感触,帮我在项目实施中操供了坚实有效的方法。感谢!

    作者回复: 强👍

    4
  • 张小宇
    2019-11-18
    redis 分布式锁的后台守护线程实现机制,可否结合代码深入讲解一下,谢谢!

    作者回复: 这块本来不是本次的重点,后面展开下🙏

    3
  • ty_young
    2019-11-28
    老师您好,请问select for update的事务隔离级别是读提交来避免超卖,那可重复读的隔离级别行不行; 一般业务系统mysql的隔离级别设置成读提交还是可重复读

    作者回复: 一般业务还是需要根据具体场景判断,不能一概而论。我讲的案例中建议是read committed

    1
  • KCMDY
    2019-11-25
    学习了

    作者回复: 👍

    1
  • zero
    2019-11-17
    感谢分享,很有感触

    作者回复: 谢谢支持

    1
  • 一只特立独行的猪
    2019-11-15
    想起以前同事写的神一般的同步代码,提交数据时把数据库里的数据先查询出来,把数据库里对应的数据删掉,然后和新数据聚合到一起再插入数据库。。。 所以发生了好几次丢数据的情况。。。

    作者回复: 😃😃

    1
  • 搬码工
    2019-11-14
    每个分享都是干货,希望能开一门课

    作者回复: 会考虑的,目前主要是工作时间紧张😊

    1
  • ty_young
    2021-03-23
    void decrease(int count){
    select total_count from stock;
    update stock set total_count = total_count - count where total_count >= count;
    }

    如果隔离级别是可重复读的话,这种方案是不是有问题
    展开
  • 前面等你
    2021-03-03
    最后扣库存的方案,先 update 再判断 num 是不是1,再去做业务逻辑;感觉有点问题:如果业务逻辑失败,库存就回不来了,还是需要单机事务或分布式事务
  • 👀
    2020-09-23
    volatile 不锁吧???不是保持共享变量可见性的嘛?
    1
  • 张天明
    2020-05-13
    最后的数据库乐观锁,用total_amount>amount 只能防止负数,不能保证数据正常扣减吧?

    作者回复: 负数是不可以的哈

  • zhushengtong
    2020-05-11
    太厉害了!
  • 夜神月
    2020-03-27
    深度和广度都兼顾到了,厉害
  • 何小盒
    2020-03-25
    学习了,老师讲的很到位!
  • 杨宁
    2020-02-04
    老师,利用守护线程实现续命锁的方案中,守护线程跪掉的情况该如何处理呢?另外,当使用锁的线程完成任务后,是不是还得通知守护线程不再续命,这样是不是又增加了复杂度?
  • 睡浴缸的人
    2020-01-16
    学习了~
  • 苏暮沉觞
    2019-12-23
    期待老师的专栏

    作者回复: 😊

  • spoofer
    2019-12-17
    用akka啊😂
  • QQ怪
    2019-12-03
    老师讲的不错,解惑了很多

    作者回复: 谢谢