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实现单机锁和分布式锁的更多相关文章

  1. springboot 中单机 redis 实现分布式锁

    在微服务中经常需要使用分布式锁,来执行一些任务.例如定期删除过期数据,在多个服务中只需要一个去执行即可. 以下说明非严格意义的分布式锁,因为 redis 实现严格意义的分布式锁还是比较复杂的,对于日常 ...

  2. Springboot中使用Redisson实现分布式锁

    1. 概述 老话说的好:便宜没好货,有价值的商品,即使再贵,也有人会买. 言归正传,今天继续讨论有关"锁"的话题,synchronized 和 ReentrantLock 大家应该 ...

  3. MasaFramework -- 锁与分布式锁

    前言 什么是锁?什么是分布式锁?它们之间有什么样的关系? 什么是锁 加锁(lock)是2018年公布的计算机科学技术名词,是指将控制变量置位,控制共享资源不能被其他线程访问.通过加锁,可以确保在同一时 ...

  4. Redis学习笔记1 -- 单机环境时分布式锁的使用

    使用第三方开源组件Jedis实现Redis客户端,且只考虑Redis服务端单机部署的场景. 前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKee ...

  5. spring-boot 中实现标准 redis 分布式锁

    一,前言 redis 现在已经成为系统缓存的必备组件,针对缓存读取更新操作,通常我们希望当缓存过期之后能够只有一个请求去更新缓存,其它请求依然使用旧的数据.这就需要用到锁,因为应用服务多数以集群方式部 ...

  6. 基于单机redis的分布式锁实现

    最近我们有个服务经常出现存储的数据出现重复,首先上一个系统流程图: 用户通过http请求可以通知任务中心结束掉自己发送的任务,这时候任务中心会通过MQ通知结束服务去结束任务保存数据,由于任务结束数据计 ...

  7. Springboot分别使用乐观锁和分布式锁(基于redisson)完成高并发防超卖

    原文 :https://blog.csdn.net/tianyaleixiaowu/article/details/90036180 乐观锁 乐观锁就是在修改时,带上version版本号.这样如果试图 ...

  8. 锁、分布式锁、无锁实战全局性ID

    1.为什么要使用锁 当发生并发时,会产生多线程争夺一个资源,为保证资源的唯一性. JVM锁:对象锁,死锁,重入锁,公平锁,偏向锁 分布式锁:数据库 nosql .zookeeper 面试题:如何排查死 ...

  9. redis 加锁与释放锁(分布式锁1)

    使用Redis的 SETNX 命令可以实现分布式锁 SETNX key value 返回值 返回整数,具体为 - 1,当 key 的值被设置 - 0,当 key 的值没被设置 分布式锁使用 impor ...

  10. redis 加锁与释放锁(分布式锁)

    使用Redis的 SETNX 命令可以实现分布式锁 SETNX key value 返回值 返回整数,具体为 - 1,当 key 的值被设置 - 0,当 key 的值没被设置

随机推荐

  1. C语言:汉诺塔问题(Hanoi Tower)------递归算法

    汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆 ...

  2. 【活动访谈】发力数字基座 推动物联创新—航天科技控股集团AIRIOT4.0平台发布会活动专访

    近日,由航天科技控股集团股份有限公司主办的"数字基座 智慧物联-AIRIOT4.0平台发布会"在北京圆满落幕.航天三院科技委总工程师王连宝应邀出席本次会议并接受媒体采访,共同参与访 ...

  3. web component基础概念及使用

    概念和使用 作为开发者,我们都知道尽可能多的重用代码是一个好主意.这对于自定义标记结构来说通常不是那么容易 - 想想复杂的HTML(以及相关的样式和脚本),有时您不得不写代码来呈现自定义UI控件,并且 ...

  4. 基于ADB Shell 实现的 Android TV、电视盒子万能遥控器 — ADB Remote ATV

    ADB Remote ATV Android TV 的遥控器,基于 ADB Shell 命令 ADB Remote ATV 是一个 Android TV 的遥控器,基于 ADB Shell 命令,泛用 ...

  5. Django——基于forms组件和ajax的注册功能

    path('register/',views.register) #注册的form表单 from django import forms from django.forms import widget ...

  6. WPF 制作高性能的透明背景异形窗口(使用 WindowChrome 而不要使用 AllowsTransparency=True)

    在 WPF 中,如果想做一个背景透明的异形窗口,基本上都要设置 WindowStyle="None".AllowsTransparency="True" 这两个 ...

  7. 用 vue2 和 webpack 快速建构 NW.js 项目

    经过实践和学习,发现本篇文章部分内容已经过时,请看我的关于 Vue 和 NW.js 的 ** 最新文章 ** 和相关实践项目 vue-nw-seed . 使用到的技能点 vue2 webpack NW ...

  8. 微信小程序预约视频号直播

    一.概述 微信小程序提供了可以唤起预约视频号直播弹窗的接口 reserveChannelsLive,该接口接收一个参数 noticeId,通过 getChannelsLiveNoticeInfo 接口 ...

  9. 莫烦tensorflow学习记录 (6)卷积神经网络 CNN (Convolutional Neural Network)

    卷积 和 神经网络 莫烦大佬的原文章https://mofanpy.com/tutorials/machine-learning/tensorflow/intro-CNN/ 我的理解就是千层饼,鸡蛋烧 ...

  10. 【Effective C++】设计与声明——考虑写出一个不抛异常的swap函数

    wap是个有趣的函数.原本它只是STL的一部分,而后成为异常安全性编程的脊柱,以及用来实现自我赋值可能性的一个常见机制.所谓swap两对象值,就是将两对象的值交换. 典型实现 缺省情况下的swap动作 ...