SpringBoot实现单机锁和分布式锁
1、使用Java的内置锁机制(单机锁)
Java提供了synchronized关键字和java.util.concurrent.locks.Lock接口来实现锁。
- synchronized是Java语言内置的关键字,当它被用作修饰一个方法时,该方法在同一时间只能被一个线程访问。
- Lock接口提供了更灵活的锁机制,包括可重入锁、公平锁、非公平锁等。
private final Lock lock = new ReentrantLock();
public void doSomething() {
lock.lock();
try {
// ... 临界区代码
} finally {
lock.unlock();
}
}
2、使用Redis实现分布式锁
虽然Redis分布式锁通常用于分布式系统中,但也可以用于单机环境。使用Redis的SETNX命令可以实现一个简单的分布式锁。
public class Demo {
@Autowired
private StringRedisTemplate stringRedisTemplate;
public boolean lock(String lockKey) {
return stringRedisTemplate.opsForValue().setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS);
}
public void unlock(String lockKey) {
stringRedisTemplate.delete(lockKey);
}
}
使用Redis实现锁的优点是它可以实现分布式锁,当你的应用需要扩展到多个实例时,这是一个很好的选择。
3、使用第三方库
还有一些第三方库,如Redisson,它提供了丰富的分布式锁实现,包括可重入锁、公平锁、联锁、读写锁等。
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
public class DistributedLockDemo {
@Autowired
private RedissonClient redissonClient;
public void test() throws InterruptedException, Throwable {
String lockKey = "myLock";
RLock lock = redissonClient.getLock(lockKey);
try {
boolean isLock = lock.tryLock(10, 5, TimeUnit.SECONDS);
if(isLock){
System.out.println("获取到锁,执行业务逻辑...");
Thread.sleep(3000);
}
} finally {
// 释放当前线程锁
if(lock.isHeldByCurrentThread()){
Tlock.unlock();
}
}
}
}
虽然这些库主要用于分布式环境,但也可以在单机环境中使用。
在选择锁的实现方式时,你需要根据你的应用的具体需求来决定。例如,如果你的应用需要扩展到多个实例,那么你可能需要使用Redis或数据库来实现分布式锁。如果你的应用只会在单个实例中运行,那么Java的内置锁机制可能就足够了。
4、使用数据库实现锁
数据库也可以用来实现锁。你可以创建一个专门的表来存储锁的信息,然后通过插入或更新记录来尝试获取锁。如果记录存在,则获取锁失败;如果记录不存在,则插入一条新记录来获取锁。
@Autowired
private JdbcTemplate jdbcTemplate;
public boolean lock(String lockKey) {
return jdbcTemplate.update("INSERT INTO lock_table (lock_key) VALUES (?) ON DUPLICATE KEY UPDATE lock_key=lock_key", lockKey) == 1;
}
public void unlock(String lockKey) {
jdbcTemplate.update("DELETE FROM lock_table WHERE lock_key=?", lockKey);
}
SpringBoot实现单机锁和分布式锁的更多相关文章
- springboot 中单机 redis 实现分布式锁
在微服务中经常需要使用分布式锁,来执行一些任务.例如定期删除过期数据,在多个服务中只需要一个去执行即可. 以下说明非严格意义的分布式锁,因为 redis 实现严格意义的分布式锁还是比较复杂的,对于日常 ...
- Springboot中使用Redisson实现分布式锁
1. 概述 老话说的好:便宜没好货,有价值的商品,即使再贵,也有人会买. 言归正传,今天继续讨论有关"锁"的话题,synchronized 和 ReentrantLock 大家应该 ...
- MasaFramework -- 锁与分布式锁
前言 什么是锁?什么是分布式锁?它们之间有什么样的关系? 什么是锁 加锁(lock)是2018年公布的计算机科学技术名词,是指将控制变量置位,控制共享资源不能被其他线程访问.通过加锁,可以确保在同一时 ...
- Redis学习笔记1 -- 单机环境时分布式锁的使用
使用第三方开源组件Jedis实现Redis客户端,且只考虑Redis服务端单机部署的场景. 前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKee ...
- spring-boot 中实现标准 redis 分布式锁
一,前言 redis 现在已经成为系统缓存的必备组件,针对缓存读取更新操作,通常我们希望当缓存过期之后能够只有一个请求去更新缓存,其它请求依然使用旧的数据.这就需要用到锁,因为应用服务多数以集群方式部 ...
- 基于单机redis的分布式锁实现
最近我们有个服务经常出现存储的数据出现重复,首先上一个系统流程图: 用户通过http请求可以通知任务中心结束掉自己发送的任务,这时候任务中心会通过MQ通知结束服务去结束任务保存数据,由于任务结束数据计 ...
- Springboot分别使用乐观锁和分布式锁(基于redisson)完成高并发防超卖
原文 :https://blog.csdn.net/tianyaleixiaowu/article/details/90036180 乐观锁 乐观锁就是在修改时,带上version版本号.这样如果试图 ...
- 锁、分布式锁、无锁实战全局性ID
1.为什么要使用锁 当发生并发时,会产生多线程争夺一个资源,为保证资源的唯一性. JVM锁:对象锁,死锁,重入锁,公平锁,偏向锁 分布式锁:数据库 nosql .zookeeper 面试题:如何排查死 ...
- redis 加锁与释放锁(分布式锁1)
使用Redis的 SETNX 命令可以实现分布式锁 SETNX key value 返回值 返回整数,具体为 - 1,当 key 的值被设置 - 0,当 key 的值没被设置 分布式锁使用 impor ...
- redis 加锁与释放锁(分布式锁)
使用Redis的 SETNX 命令可以实现分布式锁 SETNX key value 返回值 返回整数,具体为 - 1,当 key 的值被设置 - 0,当 key 的值没被设置
随机推荐
- DNS(1) -- DNS服务及dns资源类型
目录 1.1 DNS服务概述 1.2 DNS域名结构 1.3 DNS解析原理 1.3.1 DNS查询类型 1.3.2 解析答案 1.4 DNS资源记录类型 1.1 DNS服务概述 DNS(Domain ...
- Splashtop 教育行业用户增加700%
由于新冠肺炎大流行继续限制对大学.学院和K-12学校的计算机实验室的物理访问,Splashtop的销售数据表明,越来越多的学校开始使用远程访问软件作为使用计算机实验室资源的替代方法. 在6月到8月 ...
- AIRIOT答疑第1期 | 零开发基础也能干物联网平台项目?
当然可以! 物联网低代码平台以零门槛.部署快.灵活性高.满足二次开发等特点,成为近两年来IOT服务的生力军.项目团队即使没有研发人员,也可以像拼乐高一样快速搭建物联网平台,功能全面,满足多数业务场景下 ...
- jenkens
[root@mcw01 ~]$ ls .jenkins/ config.xml jenkins.install.UpgradeWizard.state nodeMonitors.xml secret. ...
- go高并发之路——缓存穿透、缓存雪崩
缓存击穿.缓存穿透.缓存雪崩是使用Redis的三个经典问题,上篇文章讲了缓存击穿,今天就讲下剩下的两个问题. 一.缓存穿透 定义:缓存穿透是指查询一个根本不存在的数据,缓存层和DB层都不会命中.这样缓 ...
- lsjORM ----让开发变得更加快捷(一)
描述: 1.lsjORM底层采用的是开源petapocoORM框架,你可以任意的拓展它 2.自动生成DAL Model BLL等文件,让习惯三层开发的你更加顺手 3.节省编写sql的时间,让开发更快捷 ...
- django中的多表关联
一.三种关联情况 二.ORM的正向操作和反向操作 1.正向操作: 一个模型中定义了一个外键,通过该模型对该外键操作的操作叫做正向操作. 2.反向操作: 被外键所关联的模型,通过该模型对外键所在模型的操 ...
- Tkinter禁止用户调整窗口尺寸大小
禁止用户调整窗口尺寸大小的方式: root.resizable(False,False) 例子: from tkinter import * from tkinter import ttk impor ...
- 数据分析---numpy模块
前戏 NumPy(Numerical Python) 是 Python 语言中做科学计算的基础库.重在于数值计算,也是大部分Python科学计算库的基础,多用于在大型.多维数组上执行的数值运算. 快捷 ...
- EndNote里参考文献的期刊名显示错误怎么办?
本文介绍EndNote文献管理软件导入文献引用时,期刊名称带有%J前缀从而不能正常显示的解决方法. 前期的文章中,我们多次介绍了文献管理软件EndNote的具体使用方法与技巧.而在使用EndN ...