拾光记录
218个文档 导航 作者 Gitee
随笔记录4
Hexo博客:基础使用Hexo博客:Next主题Hexo博客:Next进阶使用Hexo博客:Next高级配置
前端知识4
基础知识17
Vue框架19
UniApp14
微信小程序1
Java编程6
Java基础15
SpringBoot31
SpringMVC18
MyBatis9
SpringCloud15
中间件2
数据库4
MySQL13
Redis8
MongoDB10
其他数据库1
Python编程6
Python基础知识Python语法yolo目标检测OpenCV的使用及树莓派平台condauv管理工具
Linux12
Linux常用命令Jar启动脚本VirtualBox安装CentOSVirtualBox安装Ubuntu树莓派安装及使用frp内网穿透ArchLinux:基础系统安装ArchLInux:图形化界面安装ArchLinux:常用软件ArchLinux:深度优化ArchLinux:NiriArchLinux:模块记录
软件工具12
IDEAGitMavenGradleNginx安装Nginx配置JMeter压测OllamaRustFSPicGoVSCodeDocker
创意设计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();
            }
        }
    }
}
单机锁分布式锁