大家好,又见面了,我是你们的朋友全栈君。
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。
不当之处,请与指正。
参考文章:
刘清政的博客:什么是分布式锁?实现分布式锁的三种方式
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132386.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...