Redisson可重入锁实现原理 + 步骤(图解)

        原来的分布式锁他锁住的原理在于他返回的布尔值来进行逻辑分支操作,以前之所以不能重入锁的原因在于。在redis的分布式锁中,它的setIfAbsence()方法,限定了。如果该key赋了值,那么后续想要再次为此key赋值的操作都将失败,因此,我们需要可重入锁的就不能采用该方法,所以我们采用一个HashMap的数据格式,里面包含了三值,分别是key、计数器、value,它

          可重入的原理在于,当调用该锁的时候,如果该锁存在,那么我就将里面的计数器数值加一,然后手动返回一个True,进行逻辑操作,而释放锁的操作就变更为计数器的数值减一,当计数器为零的时候就释放锁,如果锁不存在就会返回一个false

存储结构:HashMap

图解:

        

1.客户端请求获取锁时,先使用setnx(key,value)方法尝试获取分布式锁

2.获得锁的线程会在Redis中设置一个计数器count,并将该计数器与当前线程ID绑定。同时,设置过期时间,防止锁永远不被释放。

3.如果其他线程再次请求加锁,则首先判断是否为持有锁的那个线程,如果是,则直接增加count的值。

4.只有当计数器的值减少到0时,即所有持有锁的线程都已经释放它时,该锁才会被释放。

代码例子:

@Service
public class ProductService {
    @Autowired
    private RedissonClient redissonClient;

    /**
     * 扣减库存
     */
    public void reduceStock(int productId, int quantity) {
        String lockKey = "product_" + productId;

        // 获取可重入锁对象
        RLock lock = redissonClient.getLock(lockKey);

        try {
            // 尝试加锁,等待时间为10秒,加锁后锁的有效期为30秒
            boolean result = lock.tryLock(10, 30, TimeUnit.SECONDS);
            if (result) {
                // 如果成功获取锁
                // 查询当前库存量
                int stock = getProductStock(productId);

                // 判断库存够不够
                if (stock < quantity) {
                    throw new RuntimeException("库存不足");
                }

                // 执行扣库存操作
                updateProductStock(productId, stock - quantity);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            // 解锁操作
            lock.unlock();
        }
    }
  /**
     * 查询商品库存量
     */
    private int getProductStock(int productId) {
        // TODO 需要连接数据库查询库存量
        return 100;
    }

    /**
     * 修改商品库存量
     */
    private void updateProductStock(int productId, int stock) {
        // TODO 需要连接数据库修改库存量
    }

         在示例代码中,我们使用RedissonClient获取一个键为 "product_" + productId 的锁对象,并在try块内进行加锁操作,等待10秒后若仍未加锁成功,则抛出异常。此处通过tryLock方法实现了可重入锁的获取,即当前线程对同一把锁可以进行重复加锁和解锁操作。 如果获取锁成功,则进行业务逻辑处理,最后释放锁对象。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
FusionCharts是一个强大的数据可视化库,可以帮助开发人员创建漂亮而交互式的图表和图形。下面是一个关于如何使用FusionCharts的详细说明,包括实例、图解和Demo。 1. 安装FusionCharts:首先,你需要从FusionCharts官方网站下载和安装FusionCharts库。你可以选择下载免费版本或购买商业许可证。 2. 引入FusionCharts库:将FusionCharts的JavaScript文件引入你的HTML文件中。你可以通过将以下代码添加到`<head>`标签中来实现: ```html <script src="fusioncharts.js"></script> ``` 3. 创建一个容器:在HTML文件中创建一个用于显示图表的容器。你可以使用一个`<div>`标签,并为其指定一个唯一的ID。例如: ```html <div id="chartContainer"></div> ``` 4. 准备数据:准备用于绘制图表的数据。你可以使用JavaScript对象或从服务器获取的JSON数据。 5. 创建图表对象:使用FusionCharts提供的API创建一个图表对象。你需要指定图表类型、数据和容器ID。例如,下面的代码创建了一个柱状图: ```javascript var chart = new FusionCharts({ type: 'column2d', renderAt: 'chartContainer', dataSource: { data: [ { label: 'January', value: '100' }, { label: 'February', value: '200' }, { label: 'March', value: '150' } ] } }); ``` 6. 渲染图表:调用图表对象的`render()`方法,将图表渲染到指定的容器中。例如: ```javascript chart.render(); ``` 7. 自定义图表:你可以使用FusionCharts提供的各种配置选项来自定义图表的外观和行为。例如,你可以更改图表的颜色、字体、标题等。你可以参考FusionCharts的文档以获取更多自定义选项。 8. 实例和图解:根据你的具体需求,可以参考FusionCharts的官方文档和示例来学习更多关于使用FusionCharts的实例和图解。 9. Demo:你可以在FusionCharts的官方网站上找到各种示例和演示,以帮助你更好地理解和使用FusionCharts。你可以尝试运行这些Demo,并从中获取灵感和指导。 希望这个详细说明对你有所帮助!如果你还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学徒630

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值