logo 范 · 拾光录
网址收集 关于作者 Github Gitee
杂文随笔4
Hexo博客:基础使用Hexo博客:Next主题Hexo博客:Next进阶使用Hexo博客:Next高级配置
前端编程3
前端基础知识16
UniApp15
Vue框架19
Java编程7
Java基础知识14
SpringBoot31
SpringMVC14
MyBatis8
SpringCloud15
RocketMQ1
MyCat1
数据库4
MySQL6
Redis7
MongoDB10
H21
Java技术栈4
知识整理分布式锁的实现方案MySQL事务MySQL的锁
软件工具箱14
IDEAGitMavenGradleNginx安装Nginx配置JMeter压测OllamaPicGoRustFSVSCodeDockerObsidianObs录制
Linux知识11
树莓派安装及使用ArchLinux:常用软件ArchLinux:基础系统安装ArchLinux:深度优化ArchLInux:图形化界面安装ArchLinux:Nirifrp内网穿透Jar启动脚本Linux常用命令VirtualBox安装CentOSVirtualBox安装Ubuntu
Python编程6
Python基础知识Python语法yolo目标检测OpenCV的使用及树莓派平台condauv
创意设计2
Blender:入门知识UI设计基础知识
AI相关9
Claude CodeHermes AgentOpenAI基本使用OpenAI工具调用OpenAI记忆管理OpenAI推理执行OpenAI开发框架Langchainllama.cpp

单机锁

适合单体应用,使用Java原生的synchronized关键字

@Service
public class OrderService {

    // 如果是静态方法锁,用类.class;如果是实例方法锁,用 this 或者定义一个 private final Object lock = new Object();
    private final Object lock = new Object(); 

    public void createOrder(String orderId) {
        // 1. 尝试获取锁(synchronized 会自动阻塞等待)
        synchronized (lock) {
            // 2. 进入代码块即获得锁
            System.out.println("线程 " + Thread.currentThread().getName() + " 获取了锁,开始执行业务...");
            
            // TODO: 这里写你的核心业务逻辑(如扣库存)
            
            // 3. 业务执行完,自动释放锁(无需手动释放)
        }
    }
}

分布式锁

分布式环境下,最简单的是使用Redisson框架

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.27.0</version> <!-- 使用最新稳定版 -->
</dependency>

代码示例

@Service
public class OrderService {

    @Autowired
    private RedissonClient redissonClient; // 注入 Redisson 客户端

    public void createOrder(String orderId) {
        // 1. 定义锁的名称(建议带业务前缀,如 "order_lock:")
        String lockKey = "order_lock:" + orderId;
        RLock lock = redissonClient.getLock(lockKey);

        try {
            // 2. 尝试加锁,最多等待 100ms,上锁后 10 秒自动解锁(防止死锁)
            boolean isLocked = lock.tryLock(100, 10, TimeUnit.SECONDS);
            
            if (isLocked) {
                // 3. 成功获取锁,执行业务
                System.out.println("获取锁成功,执行业务...");
                // TODO: 扣减库存等操作
            } else {
                throw new RuntimeException("获取锁失败,系统繁忙");
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            throw new RuntimeException("获取锁被中断");
        } finally {
            // 4. 释放锁
            if (lock.isHeldByCurrentThread()) { // 确保是自己加的锁才释放
                lock.unlock();
            }
        }
    }
}
单机锁
分布式锁