专栏首页Java进阶分布式锁的实现方式

分布式锁的实现方式

分布式锁跟 我们 平时用 的synchronized 锁 本质是都是锁。 不同的是:synchronized是 java提供的锁。 是java进程进行多线程控制时的锁。 用 分布式锁 的原因是,多个应用是不同的进程下运行的,显然用java 提供的 锁就不行了。

说说三种分布式锁的机制。 第一种,用数据库来做。

有一个 专门的 lock table。 字段有 id mothod_Name (做唯一约束)

画个图来表示:

比如三个应用进程 同时要操作 一个文件。

那么 只要设置三个进程插入的某个值 都相同,然后肯定只有一个应用进程能插入成功,成功就可以获取锁,然后去操作文件,失败的话可以重试。

释放锁的话,就将数据库的这条数据删除即可。

缺点,DB性能不好,还存在 删除数据失败的情况,如果删除数据失败,那么其他应用进程就无法获取到锁。

第二种:用zookeeper来实现

zookeeper的节点类型有四种,持久化节点,持久化有序节点,临时节点,临时有序节点。

我们可以将 订单 结算 用户三个 应用注册到 zookeeper 上当做临时节点, 然后zookeeper的临时节点又是有序的,

所以先注册的节点就能获取到锁。

画个图:

当锁用完了以后,zookeeper会将临时节点删除,然后节点2 节点3 就会按顺序获取到锁了

第三种使用 redis 来实现

redis 有一个 setnx命令。 setnx只会字key不存在的情况下 为key设置值 。

如果key 存在的话 setnx 返回的是 0 ;

如果key 不存在的话 setnx 返回的是 1 ;

三个应用进程谁先往 redis 里设置了值 谁就获取到了 锁。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 动物园园长 zookeeper

    用户2141593
  • Spring获取Bean 源码浅析

    我想上面这行代码,第一次接触过spring这个框架时都应该接触过;读取xml中我们配置的bean;

    用户2141593
  • 再谈session 和 cookie的差异

    用户2141593
  • 【DB笔试面试771】在Oracle中,OGG-00446 错误的处理办法

    在Oracle中,OGG-00446 Could not find archived log for sequence错误的处理办法是什么?

    小麦苗DBA宝典
  • 从零实现简单的"神经网络"

    如何用训练好的模型来预测新的样本,这种操作很简单,这里就不着重记录了。需要重点记录的是如何进行模型的训练,也就是各个神经元之间权重和偏置的训练。

    坑吭吭
  • 图片加速 WebP格式

    WebP是Google在2010年推出的图片技术,它可对图片进行有效压缩,不影响清晰度的同时,使图片体积更小 在质量相同的情况下,WebP格式图像的体积要比JP...

    dys
  • 自定义QQ(TIM)截图的傻傻的前缀——小文’s blog

    神无月
  • 延长你的App在后台的执行时间

    Dwyane
  • 计算机视觉之图像语义分割算法简单介绍

    这段时间一直在分享,图像语义分割相关的论文,但是,发现自己都在写论文的算法细节,没有介绍技术背景,今天来通过几个问题简单地介绍一下人工智能算法计算机视觉图像语义...

    AI深度学习求索
  • 为什么NLP相对来说这么困难?

    当我在思考这个问题的时候,不禁回想到了我的小时候就觉得非常神奇的IBM机器人沃森,这台机器人拥有当时人类所制造机器的最顶级的智慧,具有高级语言处理能力并且能够初...

    云时之间

扫码关注云+社区

领取腾讯云代金券