三种分布式锁

article/2025/10/13 6:42:12

----------本文为学习记录如有错误帮忙指正

一、什么是分布式锁?

        在单机系统下,如果多个线程同时访问一个变量或者代码片段就会产生多线程问题。(被访问的变量或者代码片段被称之为临界区域)这时我们就需要让所有线程按顺序一个一个执行对这个数据的操作就可以避免这个问题。但是在分布式的架构下,会有多台服务器同时运行,也就同时会有多个JVM运行,某一个JVM中的变量在其他JVM中是不可见的,所以简单的单机系统下的锁是无法解决分布式架构中的多线程的问题。我们就需要找到在多个JVM中都可见的锁来解决这个问题。这时就需要分布式锁。

二、三种分布式锁

        三种分布式锁分别为基于数据库实现的乐观锁,基于redis实现的分布式锁,基于zookeeper实现的分布式锁。

1.基于数据库实现的乐观锁

        提到乐观锁就不得不提CAS(compare and swap)思想,顾名思义比较和交换,在准备做数据持久化时先比较数据库中的值与操作时的值是否相等,如果相等则进行修改,否则放弃操作或者进入循环。

        CAS存在几点问题

                1.如果长时间没有操作成功线程一直在循环中,对CPU的开销过大。

                2.只能保证一个变量的原子性操作。

                3.存在ABA问题。

                ABA问题如图

        当线程1读入A数据后,线程1进入阻塞状态或者处理业务过长。这时线程2读入数据,将A改成B,随后线程3读入数据,将B改成A,这时线程1开始存入数据,将线程1读到的数据与数据库中的数据进行对比发现相同,这时可以将A改成C 。

        表面上看好像并没有什么问题,但是遇到金融方面业务就会遇到问题。

        例如:我的银行卡上有100元,这时我要取50元,由于某种原因我点击两次按钮,有线程1和线程2同时操作,线程1取走我50元后,线程2进入阻塞状态,这时有人往我卡上打入50元,线程2开始执行操作,在最后发现我账户上为100元与当时查到的相同,第二次成功取走50元导致发生多线程问题。

        解决方法:加入版本号

        在数据库中加入新的一列version,在每一次update成功后都进行+1,这样就可以完美避免ABA问题。SQL为update 表明 set data = data, version = version + 1 where version = version。

2.基于redis的分布式锁

        redis分布式锁主要体现为对redis服务器中的key和value的抢占。当线程需要获取锁时就会向redis中插入一条key,value,如果插入成功就可以成功获取锁,如果redis中已经存在了该锁导致插入失败则获取锁失败。

        

        上面模式的redis分布式锁存在以下问题

        当线程1拿到锁后在执行业务时因为某些原因进入阻塞状态导致锁超时自动释放,这时线程2拿到锁,再线程2的业务没有执行完时,线程1从阻塞状态转换为运行状态,业务执行完成执行释放锁的代码,这是线程2拿到的锁被莫名奇妙的释放了,这就产生了问题。

        解决方案有两种:

                1.设置锁超时时间远大于业务执行时间

                2.为每个线程拿到锁时添加唯一标识(建议在key上存储业务名,在value上存储uuid),删除锁时要判断锁与当前线程是否对应

        针对解决方案2仍然存在问题:

                在判断key是否相等然后删除锁这并不满足原子性

        当线程1代码执行结束准备释放锁前判断锁和线程1是否对应,判断结束后线程1进入阻塞状态,还是会发生上面提到的问题。

        解决方案:

                将判断线程和锁是否对应和释放锁这两步操作放到Lua脚本中执行。

3.基于zookeeper的分布式锁

        zookeeper的分布式锁主要是利用了临时顺序节点的特性,使每个进来的线程按顺序执行。

        首先建立一个持久节点作为父节点,当有线程需要执行被锁控制的代码时会先查询父节点下面是否有其他子节点,如果没有则在父节点下面创建一个临时顺序节点作为子节点,获得锁。

        当线程2需要执行代码时,同样的还是会在父节点下创建一个临时顺序节点,然后判断自己是不是顺序最靠前的节点,如果不是则注册一个watcher用于监听前面的节点。之后进来的每一个节点都是监听其前面的一个节点。

        如果线程执行结束,则会删除自己的节点,后面监听他的节点发现其被删除后即可开始执行。 

         

        

        


http://chatgpt.dhexx.cn/article/YoVmy7Bx.shtml

相关文章

Redis实现分布式锁

目录 一、前言 为什么需要分布式锁? 二、基于redis实现分布式锁 为什么redis可以实现分布式锁? 如何实现? 锁的获取 锁的释放 三、如何避免死锁?锁的过期时间如何设置? 避免死锁 锁过期处理 释放其他服务的锁…

什么是分布式锁?几种分布式锁分别是怎么实现的?

一、什么是分布式锁: 1、什么是分布式锁: 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题,而分布式锁,就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是&am…

软件需求最佳实践笔记(一)

1.软件需求最佳实践笔记 | 需求框架 前言:SERU是一套系统全面的需求方法论,可指导我们日常的软件需求工作。曾参加过徐峰老师软件需求最佳实践课程的培训,收益颇多,现通过笔记形式整理出来,以期与具有同样需求的读者共…

声音信号基音提取算法基频和谐波处理分析

1、内容简介 略 293-可以交流、咨询、答疑 2、内容说明 略 一、 实验原理: 傅里叶变换建立了信号频谱的概念。所谓傅里叶分析即分析信号的频谱(频率构成)、频带宽度等。要想合成出一段音乐,就要了解该段音乐的基波频率、谐波构成等。因此,必须采用傅里叶变换这…

软件工程—需求分析阶段

第一步、需求获取 为了保证能全面地获取信息,以更好地服务于产品设计和迭代,产品经理必须利用内部外部等多种渠道来获取用户需求。并且因渠道差异,产品经理所采取的方式与方法也相应会有所差异,所以产品经理还必须根据不同的渠道…

作业1.1利用Audacity软件分析音频

文章目录 前言实验内容实验步骤实验结果结果分析总结 前言 Audacity软件分析其余格式的音频时需要安装FFmpeg库,所以我们下载一个格式转换软件将音频转为MP3格式进行处理。语音信号具有短时平稳性,即在一个短时间范围内(10-30ms)…

C++ OBS源码分析与屏幕录制软件开发视频教程

本课程主要讲解OBS源码的编译,OBS功能实现,初始化,显示器录制,窗口的实现录制,以及录制模块源码详细分析,最后基于OBS源码开发了一个录制软件,界面如下: 主要有如下功能 &#xff0…

酒店管理系统-需求分析报告

目录 1.引言 1.1编制的目的 1.2术语定义 1.3参考资料 1.4相关文档 2.概述 2.1项目的描述 2.2项目的功能 2.3用户特点 3.具体需求 3.1业务需求 3.1.1主要业务 3.1.2未来增长预测 3.2用户需求 3.3应用需求 3.3.1系统功能 3.3.2主要应用及使用方式 3.4网络基本结构…

基于matlab的声波分析研究,基于MATLAB的声音信号分析与处理(共13页)

设计了一套信号采集与处理系统,建立了傅立叶变换算法模型,可获得其频谱图进行频谱分析,建立滤波器的设计算法模型设计了一个声音滤波器,建立滤波算法模型可对声音信号进行滤波。本套系统的算法建立都是基于MATLAB软件,…

分析评估和定位声音质量

/** * author wangdaopo * email 3168270295qq.com */ 影响音频质量和稳定性的因素 音质好坏的评价,响度、音高、音色, 测试,你的语音引擎是基本可用的,客观评测软件是RMAA(RightMark Audio Analyzer;比…

声学计算机软件,常用声学仿真软件汇总

声学仿真软件根据计算原理不同大致分为以下几类: 一、电力声类比法 将振动系统和声学系统转化为等效电路,是一种0维的参数化建模方法; 优点:计算速度快; 缺点:无法预测高频响应以及复杂声波叠加&#xff1b…

荔枝软件如何测试声音,荔枝如何测自己的声音 荔枝测自己的声音方法

您可能感兴趣的话题: 荔枝 测自己的声音 核心提示:  荔枝APP有一个特色功能——声鉴卡,声鉴卡可以用来测试用户的音色,比如女神音、御姐音、少年音等等,很多人都想用声鉴卡测试一下自己的音色,却不知道荔枝…

电脑版频谱测试软件,电脑实时声音频谱PC Sound Spectrum

PC Sound Spectrum是完全免费提供给广大用户们使用的一个电脑声音实时频谱显示软件,可以将电脑声卡里所有的声音捕捉并转换为24段动态频谱显示,也可透明显示,拥有鼠标穿透效果,而且不用安装,没有插件,体积小…

软件产品案例分析

软件产品案例分析 第一部分: 评测: 上手体验: 说实话,在老师布置这个作业之前我确实不知道有K米这个APP,我想这是很少去KTV的原因吧。。。不过在接到这个作业后,我就去百度了普及了一下这个app的相关知识。…

基于AI的恶意软件分析技术(3)

一篇综述:用于检测和分类恶意软件的机器学习的兴起:研究的发展、趋势和挑战 阅读The rise of machine learning for detection and classification of malware: Research developments, trends and challenges翻译&笔记 原文:https://w…

吉林大学软件需求分析 Software Requirement Analysis

文章目录 吉林大学软件需求分析 Software Requirement Analysis缩写/术语Chapter 1 Introduction1 Software and Engineering1.1Software1.2软件工程1.3需求对软件项目的影响 2 Software Requirements2.1问题域2.2需求 3 Requirements Engineering3.1需求工程的历史3.2需求工程…

splunk 日志分析软件 简介

目录 Splunk总体介绍 简介 Splunk是什么 Splunk做什么 Splunk如何做 应用场景 日志管理 为机器数据建立索引 搜索、关联、调查 钻取分析 监控&告警 报表和仪表盘 IT运维监控 IT运维监控视图 丰富的App和插件 安全和欺诈 安全神经中心 安全挑战 高级…

需求分析-用户故事

需求分析 - 用户故事(User Story) 用户故事(一) 用户故事在软件开发过程中被作为描述需求的一种表达形式;为了规范用户故事的表达,便于沟通;包含角色、活动、价值三个要素。 用户故事的概念 概念这种东西我喜欢说文…

matlab实现声音信号的频谱分析,基于MATLAB的声音信号频谱分析的课程设计.doc

基于MATLAB的声音信号频谱分析的课程设计.doc 基于 MATLAB 的声音信号频谱分析组号11 组1 课程设计目的综合运用数学信号处理的理论知识进行频谱分析和滤波器设计,通过理论推导得出相应结论,再利用 MATLAB 作为编程工具进行计算机实现,从而加…

数据压缩作业1之:使用音频分析软件(Audacity)分析浊音、清音爆破音的时域及频域特性。

录制的浊音为/d/,清音为/ʃ/,爆破音为/t/ 实验结果 浊音时域 浊音频域 清音时域 清音频域 爆破音时域 爆破音频域 分析 从实验结果可以看出: ①在时域上,相同的单位时间内,浊音的幅度变化范围最大,…