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

avatar
作者
猴君
阅读量:0

在使用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块中检查锁是否由当前线程持有,如果是,则释放锁。这是为了防止由于异常

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

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!