当前位置:   article > 正文

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

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

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

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

码:

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

依赖:

  1. <dependency>
  2. <groupId>org.redisson</groupId>
  3. <artifactId>redisson</artifactId>
  4. <version>3.16.6</version> <!-- 使用最新稳定版本 -->
  5. </dependency>

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

获取和释放这个锁:

  1. import org.redisson.Redisson;
  2. import org.redisson.api.RLock;
  3. import org.redisson.api.RedissonClient;
  4. import org.redisson.config.Config;
  5. import java.util.concurrent.ExecutorService;
  6. import java.util.concurrent.Executors;
  7. import java.util.concurrent.TimeUnit;
  8. public class RedissonDistributedLockExample {
  9. public static void main(String[] args) {
  10. // 创建Redisson配置
  11. Config config = new Config();
  12. config.useSingleServer().setAddress("redis://127.0.0.1:6379");
  13. // 初始化Redisson客户端
  14. RedissonClient redisson = Redisson.create(config);
  15. // 获取一个RLock实例
  16. RLock lock = redisson.getLock("myLock");
  17. // 创建线程池
  18. ExecutorService executorService = Executors.newFixedThreadPool(5);
  19. // 提交任务到线程池
  20. for (int i = 0; i < 5; i++) {
  21. executorService.submit(() -> {
  22. try {
  23. // 尝试获取锁,等待时间为1秒,锁的超时时间为5秒
  24. if (lock.tryLock(1, 5, TimeUnit.SECONDS)) {
  25. System.out.println(Thread.currentThread().getName() + " acquired the lock.");
  26. // 执行临界区代码
  27. try {
  28. Thread.sleep(2000); // 模拟长时间运行的任务
  29. } catch (InterruptedException e) {
  30. Thread.currentThread().interrupt();
  31. }
  32. System.out.println(Thread.currentThread().getName() + " releasing the lock.");
  33. } else {
  34. System.out.println(Thread.currentThread().getName() + " failed to acquire the lock.");
  35. }
  36. } finally {
  37. // 在finally块中释放锁,确保锁总是被释放
  38. if (lock.isHeldByCurrentThread()) {
  39. lock.unlock();
  40. }
  41. }
  42. });
  43. }
  44. // 关闭线程池
  45. executorService.shutdown();
  46. // 等待所有任务完成
  47. try {
  48. executorService.awaitTermination(10, TimeUnit.SECONDS);
  49. } catch (InterruptedException e) {
  50. Thread.currentThread().interrupt();
  51. }
  52. // 关闭Redisson客户端
  53. redisson.shutdown();
  54. }
  55. }

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

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

出相应的消息。

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/848363
推荐阅读
相关标签
  

闽ICP备14008679号