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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vps自建_七牛云搭建图床

    vps自建_七牛云搭建图床目的:将一些小服务应用部署到免费的serverless/VPS上去环境:0成本实现方式:github+vercel/freewha效果:项目一:个人导航项目二:个人博客项目三:个人音乐服务器:背景:上面的项目以前我都是部署在家里群晖上,或者VPS上,但是FRPC和VPS的流量,延时、运维更新等问题,实际用起来很繁琐,最近两年serverless发展很火,于是就萌生了把他们部署到免费的VPS或者serverless产品上网络上有很多hexo博客部署到vercel、github.

    2025年6月11日
    0
  • 学java还是python哪个就业好_JAVA和Python哪个好就业?

    学java还是python哪个就业好_JAVA和Python哪个好就业?Python和Java是现在最火的两种编程语言,Python和Java的就业前景都很好,具体选择哪一个要看你自身对哪种编程语言更感兴趣。Python的就业方向和前景学习Python以后可以从事数据分析工作,无论是什么行业,做数据分析的人似乎都离不开Python,因为Python可以帮助他们提高工作效率。也可以从事网络编程工作,Python可以非常方便的完成网络编程的工作,提供了众多的解决方案和模块…

    2022年7月8日
    20
  • keras conv(keras中文手册)

    Conv2D:图像空间的2维卷积keras.layers.Conv2D(filters,kernel_size,strides=(1,1),padding=’valid’,data_format=None,dilation_rate=(1,1),activation=None,use_bias=True,kernel_initializer=’glo…

    2022年4月12日
    71
  • 什么是WinHTTP?「建议收藏」

    什么是WinHTTP?「建议收藏」WinHTTP的全称是MicrosoftWindowsHTTPServices,它提供给开发者一个HTTP客户端应用程序接口(API),通过这种API借助HTTP协议给其他的HTTP服务器发

    2022年7月4日
    56
  • HDLBits答案(12)_Verilog移位寄存器「建议收藏」

    HDLBits答案(12)_Verilog移位寄存器「建议收藏」Verilog移位寄存器HDLBits链接前言今天更新一节寄存器相关内容,其中涉及CRC校验的内容是用线性反馈移位寄存器搭建而成的。题库题目描述1:构建一个4bit的移位寄存器(右移),含异步复位、同步加载和使能areset:让寄存器复位为0load:加载4bit数据到移位寄存器中,不移位ena:使能右移q:移位寄存器中的内容Solution1:moduletop_module(inputclk,inputareset,//asyncacti

    2022年7月16日
    11
  • linux(6)查看进程ps命令「建议收藏」

    linux(6)查看进程ps命令「建议收藏」ps命令Linuxps(英文全拼:processstatus)命令用于显示当前进程的状态,类似于windows的任务管理器查看所有进程ps-A显示所有进程信息,连同命令行ps-

    2022年7月28日
    7

发表回复

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

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