Java-使用Redisson实现的分布式锁

在使用Redisson实现的分布式锁时,可以很容易地在Java中加入多线程代码来模拟并发环境下

的锁行为。以下是一个使用Redisson的RLock接口创建分布式锁并在多线程环境中使用的示例代

码:

首先,需要在项目中添加Redisson的依赖。如果你使用Maven,可以在pom.xml文件中添加以下

依赖:

复制代码
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.16.6</version> <!-- 使用最新稳定版本 -->
</dependency>

可以创建一个RedissonClient实例并使用它来获取一个RLock对象。接下来,创建多个线程来尝试

获取和释放这个锁:

java 复制代码
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class RedissonDistributedLockExample {

    public static void main(String[] args) {
        // 创建Redisson配置
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        
        // 初始化Redisson客户端
        RedissonClient redisson = Redisson.create(config);
        
        // 获取一个RLock实例
        RLock lock = redisson.getLock("myLock");
        
        // 创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        
        // 提交任务到线程池
        for (int i = 0; i < 5; i++) {
            executorService.submit(() -> {
                try {
                    // 尝试获取锁,等待时间为1秒,锁的超时时间为5秒
                    if (lock.tryLock(1, 5, TimeUnit.SECONDS)) {
                        System.out.println(Thread.currentThread().getName() + " acquired the lock.");
                        
                        // 执行临界区代码
                        try {
                            Thread.sleep(2000); // 模拟长时间运行的任务
                        } catch (InterruptedException e) {
                            Thread.currentThread().interrupt();
                        }
                        
                        System.out.println(Thread.currentThread().getName() + " releasing the lock.");
                    } else {
                        System.out.println(Thread.currentThread().getName() + " failed to acquire the lock.");
                    }
                } finally {
                    // 在finally块中释放锁,确保锁总是被释放
                    if (lock.isHeldByCurrentThread()) {
                        lock.unlock();
                    }
                }
            });
        }
        
        // 关闭线程池
        executorService.shutdown();
        
        // 等待所有任务完成
        try {
            executorService.awaitTermination(10, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        
        // 关闭Redisson客户端
        redisson.shutdown();
    }
}

我们创建了一个固定大小的线程池,然后提交了五个任务到线程池中。每个任务都尝试获取锁,如

果成功则输出一条消息,然后模拟一个长时间运行的任务,最后释放锁。如果获取锁失败,也会输

出相应的消息。

注意,我们在finally块中检查锁是否由当前线程持有,如果是,则释放锁。这是为了防止由于异常

导致的锁未被释放的情况。

相关推荐
葡萄成熟时 !11 小时前
JAVA 常用API学习笔记
java·笔记·学习
Rain的Java大神之路12 小时前
介绍一下分布式事务
java·分布式·后端·spring·spring cloud·架构·springcloud
吴声子夜歌13 小时前
Java面试题——基础(一)
java·开发语言
南城以南溫暖如初14714 小时前
外卖CPS实战指南:从技术选型到运营落地全流程解析
java·spring boot·mysql·架构·vue
傻啦嘿哟14 小时前
英雄联盟皮肤爬虫:爬取全皮肤价格与特效,做比价工具
java·c++·爬虫
码匠许师傅15 小时前
【C++ 面试真题】24. 聊聊 C++ 的时间日期处理
java·c++·面试
mqiqe16 小时前
AgentScope Java 2.0 Agent 状态存储(AgentStateStore)深度解析:构建可恢复、可扩展的智能体运行时
java·运维·网络
zhifou12345616 小时前
java 17升级安装
java·开发语言
用户37215742613516 小时前
如何使用 Java 将 Markdown 转换为 PDF(含自定义设置)
java
用户37215742613517 小时前
如何使用 Java 在 Word 文档中添加和删除水印:分步指南
java