Redisson 分布式锁可重入的原理

目录

1. 使用 Redis 实现分布式锁存在的问题

2. Redisson 的分布式锁解决不可重入问题的原理


1. 使用 Redis 实现分布式锁存在的问题

  • 不可重入:同一个线程无法两次 / 多次获取锁
  • 举例
    • method1 执行需要获取锁
    • method2 执行也需要(同一把)锁
    • 如果 method1 中调用了 method2,就会出现死锁的情况
    • method1 执行的过程是同一个线程,但是锁无法识别,则无法重入

2. Redisson 的分布式锁解决不可重入问题的原理

  • 原理
    • 判断是否可重入:记录占有锁的当前线程和想要获取锁的线程是否是同一个线程,如果是则获取锁成功
    • 获取锁
      • 判断锁是否是自己的
      • 在 hash 的 value 中记录锁总共被(同一线程)获取的次数,获取一次,value + 1,且要重置锁的有效期,给重入的方法执行预留充足时间
    • 释放锁:判断锁的重入次数(即 value)是否为 0
      • 如果为 0,说明重入锁的层数到了最外层(method1),可以执行释放锁的逻辑
      • 如果 value > 0,说明还没有到最外层(还在执行 method2),则不能释放锁,而是将 value - 1,表示跳到外面一层,且需要重置锁的有效期
  • 核心思想:利用 Redis 中的 hash 结构,记录获取锁的线程和重入次数

  • 获取锁和释放锁的原子性:Lua 脚本

相关推荐

  1. redisson实现分布式吗?

    2024-01-25 19:40:04       30 阅读
  2. 【Redis笔记】使用Redisson实现

    2024-01-25 19:40:04       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-25 19:40:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-25 19:40:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-25 19:40:04       82 阅读
  4. Python语言-面向对象

    2024-01-25 19:40:04       91 阅读

热门阅读

  1. LeetCode2865. Beautiful Towers I

    2024-01-25 19:40:04       56 阅读
  2. 什么是IDE?新手用哪个IDE比较好?

    2024-01-25 19:40:04       61 阅读
  3. P8597 [蓝桥杯 2013 省 B] 翻硬币

    2024-01-25 19:40:04       55 阅读
  4. 连接两个链表。

    2024-01-25 19:40:04       63 阅读
  5. 【issue—成像系统】1. 机器视觉照明技术基础

    2024-01-25 19:40:04       60 阅读
  6. 粒子群算法和模因算法的关系?

    2024-01-25 19:40:04       60 阅读