Java分布式锁

Java分布式锁Java分布式锁我的理解应该叫集群锁或者跨实例锁锁的作用是在多线程情况下,控制线程同步访问变量,执行代码块、方法,例如synchronized,在单个jvm进程中,这样是奏效的。但是在分布式环境中,单个服务往往都是要部署多台实例的,在有多个jvm进程的集群里,synchronized就达不到我们的要求了。synchronized只能控制当前jvm进程中的线程,对于其它jvm进程中的线程,它无能为力。也就是说有可能一个jvm中的线程是同步执行的,在此过程中,或许会有集群里其它jvm的线程执行到

大家好,又见面了,我是你们的朋友全栈君。

Java分布式锁

我的理解应该叫集群锁或者跨实例锁

锁的作用是在多线程情况下,控制线程同步访问变量,执行代码块、方法,
例如synchronized,在单个jvm进程中,这样是奏效的。

但是在分布式环境中,单个服务往往都是要部署多台实例的,
在有多个jvm进程的集群里,synchronized就达不到我们的要求了。

synchronized只能控制当前jvm进程中的线程,对于其它jvm进程中的线程,它无能为力。
也就是说有可能一个jvm中的线程是同步执行的,在此过程中,
或许会有集群里其它jvm的线程执行到这儿,它不会被阻塞,那这就不是同步了。

对synchronized不太了解的话可以看下这里:
对于Java中synchronized关键字的简单理解

为了应对这种场景,分布式锁就出现了。

基于数据库的分布式锁

实现方式是:在数据库中创建一张表,包含变量名、方法名、服务器IP+线程ID等信息,
变量名、方法名字段上加有唯一约束,
想要访问某个变量或执行某个方法,就往这张表添加数据,
添加成功则获取锁,若添加失败则根据当前服务器+线程和变量名、方法名查询数据,
如果存在对应记录,也获取锁,不存在则需要重试获取锁,执行完成后立即删除对应记录。

线程ID是为了实现锁的可重入性,什么是可重入:
Java多线程-01.ReentrantLock、ReadWriteLock

依赖数据库需要一定的资源开销,性能问题需要考虑。

基于Redis的分布式锁

基于Redis的优点:
1、Redis有着很高的性能;
2、Redis的方法对于实现分布式锁有着较好的支持;

实现方式是:
获取锁的时候,使用setnx加锁,
setnx:当且仅当key不存在时,set一个值为value的key,返回1,
若key存在,不做任何操作,返回0。
key我们取变量名、方法名,value存当前服务器IP+线程ID。
可以设置一个超时时间,超时自动释放锁,
执行完成后立即删除对应的key。


不当之处,请与指正。

参考文章:

刘清政的博客什么是分布式锁?实现分布式锁的三种方式

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132386.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月10日 下午9:16
下一篇 2022年6月10日 下午9:16


相关推荐

  • OJ平台汇总

    OJ平台汇总leetcode:https://leetcode.com/提交错误能够给出错误的数据,比较好调试。浙江大学OnlineJudge(ZOJ):http://acm.zju.edu.cn/国内最早也是最有名气的OJ,打开速度快。北京大学OnlineJudge(POJ):http://acm.pku.edu.cn/JudgeOnline/举行在线比赛比较多,数据比ZOJ上的

    2022年6月16日
    37
  • MAX31865模块的使用-基于ZigBee_CC2530芯片 PT100测温

    MAX31865模块的使用-基于ZigBee_CC2530芯片 PT100测温前言  网络上关于ZigBee和MAX31865的相关资料较少,对于如何在CC2530上实现对PT100温度数据的读取的资料更是几乎没有。因此本文对MAX31865芯片和模块的使用进行简要介绍,并提供使用源码,同时提供自制模块的相关原理图。文章目录前言一、相关资料二、MAX31865芯片介绍2.1简介:2.2:读写时序2.3:配置寄存器2.4错误标志2.5温度读取三、MAX31865模块介绍3.1引脚介绍3.2线制选择与接线四、代码4.1配置I/O寄存器4.2SPI写寄存器4.3SPI读寄存

    2022年6月29日
    27
  • pycharm搭建python环境_pycharm如何配置编译环境

    pycharm搭建python环境_pycharm如何配置编译环境1.安装python27双击执行python-2.7.15.msi,选择装到根目录,建议d:\Python27。一路下一步,直到完成。安装完成之后,打开cmd,输入:python,如果显示以下内容则说明安装python成功如果提示命令不存在则需要设置环境变量。windows:右键我的电脑–属性–高级系统设置–高级–环境变量–系统变量找到path项,加上值,D:\Python27;D:\P…

    2022年8月25日
    12
  • AI Agent 入门指南:30 分钟搭建你的第一个智能体

    AI Agent 入门指南:30 分钟搭建你的第一个智能体

    2026年3月14日
    1
  • Springboot 项目JVM优化「建议收藏」

    Springboot 项目JVM优化「建议收藏」一,SpringBoot扫包优化@SpringBootApplication注解自动获取应用的配置信息,会给应用带来一些副作用。由自动配置(auto-configuration)和组件扫描(componentscanning)组成,这跟使用@Configuration、@EnableAutoConfiguration和@ComponentScan三个注解的作用是一样的。…

    2022年5月2日
    38
  • 十字相乘法c语言,十字相乘法的运算方法

    十字相乘法c语言,十字相乘法的运算方法借助画十字分解系数 从而把二次三项式分解的方法叫做 是二次三项式分解的一种常用方法 它是先将二次三项式的 a 及常数项 c 都分解为两个因数的乘积 一般会有几种不同的分法 然后按斜线交叉相乘 再相加 若有 则有 否则 需交换的位置再试 若仍不行 再换另一组 用同样的方法试验 直到找到合适的为止 在我们做分解题时 可以参照下面的口诀 首先提取公因式 然后考虑用公式 十字相乘试一试 分组分得要合适

    2026年3月20日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号