Redisson的可重入锁使用

Redisson实现的是可重入锁,同一线程获取同一个锁返回一直是true,每次都会更新锁的有效期

ReentrantLock是可重入锁,那它的特点就是:同一个线程可以重复拿到同一个资源的锁。重入锁非常有利于资源的高效利用。

若是本地单元测试,则需要考虑启多个线程进行测试锁,否则可能会因可重入锁而失败

实例

依赖

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.14.1</version>
</dependency>

demo

import java.util.concurrent.TimeUnit;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

public class RedisDemo {
    public static void main(String[] args) throws InterruptedException {
        Config config = new Config();
        config.useSingleServer().setAddress("127.0.0.1:6379")
        	.setUsername("admin").setPassword("admin");
        RedissonClient redisson = Redisson.create(config);
        RLock rLock = redisson.getLock("MyLock");

        // 尝试锁100s,锁等待时间1s
        boolean locked = rLock.tryLock(1, 100, TimeUnit.SECONDS);
        // true,redis中MyLock的值为hash值(key为"机器uuid:线程name",value为当前锁重入的计数值)
        System.out.println(locked);
        boolean locked2 = rLock.tryLock(1, 100, TimeUnit.SECONDS);
        // 可重入锁,结果依然是true,hash的value计数变为2
        System.out.println(locked2);
        rLock.unlock();

    }
}

参考

  1. Redisson实现分布式锁1
  2. Redisson实现分布式锁2