前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java分布式锁

Java分布式锁

作者头像
全栈程序员站长
发布2022-06-29 09:58:52
3090
发布2022-06-29 09:58:52
举报
文章被收录于专栏:全栈程序员必看

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

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.cn/132386.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java分布式锁
    • 基于数据库的分布式锁
      • 基于Redis的分布式锁
      相关产品与服务
      云数据库 Redis
      腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档