赞
踩
在使用Redisson实现的分布式锁时,可以很容易地在Java中加入多线程代码来模拟并发环境下
的锁行为。以下是一个使用Redisson的RLock接口创建分布式锁并在多线程环境中使用的示例代
码:
首先,需要在项目中添加Redisson的依赖。如果你使用Maven,可以在pom.xml文件中添加以下
依赖:
- <dependency>
- <groupId>org.redisson</groupId>
- <artifactId>redisson</artifactId>
- <version>3.16.6</version> <!-- 使用最新稳定版本 -->
- </dependency>
可以创建一个RedissonClient实例并使用它来获取一个RLock对象。接下来,创建多个线程来尝试
获取和释放这个锁:
- 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块中检查锁是否由当前线程持有,如果是,则释放锁。这是为了防止由于异常
导致的锁未被释放的情况。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。