ReadWriteLock 降级未按预期工作

ReadWriteLock downgrading not working as expected

提问人:elizalde1981 提问时间:4/5/2022 更新时间:4/5/2022 访问量:128

问:

我是 Redisson 的新手,并尝试实现 ReadWriteLock 降级,但在发布 writeLock 后,即使仍有读锁并且 30 秒后读锁消失,Redisson 也不会更新锁。

我创建了一个简单的示例来测试降级,但它没有按预期工作。在第一部分中,代码是创建一个读写锁,然后获取一个写锁和读锁。为了检查 Redisson 是否保持这些锁没有问题,代码每 5 秒检查一次 TTL,锁计数,一切看起来都很好。

但是,在释放 writeLock 后,Redisson 不再续订锁,并且在 30 秒后消失了。我期望 Redisson 继续保持 readLock 处于活动状态,直到它被释放。

import java.util.concurrent.TimeUnit;

import org.redisson.Redisson;
import org.redisson.api.RReadWriteLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ReadWriteLockExample {

    private static final Logger logger = LoggerFactory.getLogger(ReadWriteLockExample.class);

    public static void main(String[] args) {

        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");

        RedissonClient redisson = Redisson.create(config);

        RReadWriteLock rwlock = redisson.getReadWriteLock("myLock");

        rwlock.writeLock().lock();
        logger.info("Write lock acquired");
        logger.info("Write lock count: " + rwlock.writeLock().getHoldCount());
        logger.info("Read lock count: " + rwlock.readLock().getHoldCount());

        rwlock.readLock().lock();
        logger.info("Read lock acquired");
        logger.info("Write lock count: " + rwlock.writeLock().getHoldCount());
        logger.info("Read lock count: " + rwlock.readLock().getHoldCount());
        
        for (int i = 0; i < 6; i++) {
            logger.info("Lock TTL: {} Write lock count {} Read lock count: {}", rwlock.readLock().remainTimeToLive(),
                    rwlock.writeLock().getHoldCount(), rwlock.readLock().getHoldCount());
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException ie) {
                Thread.currentThread().interrupt();
            }
        }

        // Lock downgrading
        rwlock.writeLock().unlock();
        logger.info("Write lock released/downgraded");
        logger.info("Write lock count: " + rwlock.writeLock().getHoldCount());
        logger.info("Read lock count: " + rwlock.readLock().getHoldCount());

        // After 30 seconds, I would expect to see the readLock still locking
        // However is gone
        for (int i = 0; i < 6; i++) {
            logger.info("Lock TTL: {} Write lock count {} Read lock count: {}", rwlock.readLock().remainTimeToLive(),
                    rwlock.writeLock().getHoldCount(), rwlock.readLock().getHoldCount());
            try {
                TimeUnit.SECONDS.sleep(5);
            } catch (InterruptedException ie) {
                Thread.currentThread().interrupt();
            }
        }

        logger.info("Write lock count after 30s: " + rwlock.writeLock().getHoldCount());
        logger.info("Read lock count after 30s: " + rwlock.readLock().getHoldCount());

        // Releasing ReadLock
        rwlock.readLock().unlock();
        logger.info("Read lock released");
        logger.info("Write lock count: " + rwlock.writeLock().getHoldCount());
        logger.info("Read lock count: " + rwlock.readLock().getHoldCount());

        redisson.shutdown();

    }

}

输出:

11:34:43.417 [main] INFO  org.redisson.Version - Redisson 3.16.8
11:34:44.382 [redisson-netty-2-14] INFO  org.redisson.connection.pool.MasterPubSubConnectionPool - 1 connections initialized for 127.0.0.1/127.0.0.1:6379
11:34:44.405 [redisson-netty-2-19] INFO  org.redisson.connection.pool.MasterConnectionPool - 24 connections initialized for 127.0.0.1/127.0.0.1:6379
11:34:44.455 [main] INFO  com.test.redis.ReadWriteLockExample - Write lock acquired
11:34:44.459 [main] INFO  com.test.redis.ReadWriteLockExample - Write lock count: 1
11:34:44.461 [main] INFO  com.test.redis.ReadWriteLockExample - Read lock count: 0
11:34:44.463 [main] INFO  com.test.redis.ReadWriteLockExample - Read lock acquired
11:34:44.465 [main] INFO  com.test.redis.ReadWriteLockExample - Write lock count: 1
11:34:44.466 [main] INFO  com.test.redis.ReadWriteLockExample - Read lock count: 1
11:34:44.469 [main] INFO  com.test.redis.ReadWriteLockExample - Lock TTL: 29997 Write lock count 1 Read lock count: 1
11:34:49.484 [main] INFO  com.test.redis.ReadWriteLockExample - Lock TTL: 24988 Write lock count 1 Read lock count: 1
11:34:54.514 [main] INFO  com.test.redis.ReadWriteLockExample - Lock TTL: 19961 Write lock count 1 Read lock count: 1
11:34:59.541 [main] INFO  com.test.redis.ReadWriteLockExample - Lock TTL: 25019 Write lock count 1 Read lock count: 1
11:35:04.569 [main] INFO  com.test.redis.ReadWriteLockExample - Lock TTL: 19996 Write lock count 1 Read lock count: 1
11:35:09.582 [main] INFO  com.test.redis.ReadWriteLockExample - Lock TTL: 25074 Write lock count 1 Read lock count: 1
11:35:14.596 [main] INFO  com.test.redis.ReadWriteLockExample - Write lock released/downgraded
11:35:14.599 [main] INFO  com.test.redis.ReadWriteLockExample - Write lock count: 0
11:35:14.603 [main] INFO  com.test.redis.ReadWriteLockExample - Read lock count: 1
11:35:14.615 [main] INFO  com.test.redis.ReadWriteLockExample - Lock TTL: 20042 Write lock count 0 Read lock count: 1
11:35:19.635 [main] INFO  com.test.redis.ReadWriteLockExample - Lock TTL: 15021 Write lock count 0 Read lock count: 1
11:35:24.647 [main] INFO  com.test.redis.ReadWriteLockExample - Lock TTL: 10009 Write lock count 0 Read lock count: 1
11:35:29.658 [main] INFO  com.test.redis.ReadWriteLockExample - Lock TTL: 4998 Write lock count 0 Read lock count: 1
11:35:34.681 [main] INFO  com.test.redis.ReadWriteLockExample - Lock TTL: -2 Write lock count 0 Read lock count: 0
11:35:39.709 [main] INFO  com.test.redis.ReadWriteLockExample - Lock TTL: -2 Write lock count 0 Read lock count: 0
11:35:44.727 [main] INFO  com.test.redis.ReadWriteLockExample - Write lock count after 30s: 0
11:35:44.731 [main] INFO  com.test.redis.ReadWriteLockExample - Read lock count after 30s: 0
11:35:44.738 [main] INFO  com.test.redis.ReadWriteLockExample - Read lock released
11:35:44.742 [main] INFO  com.test.redis.ReadWriteLockExample - Write lock count: 0
11:35:44.745 [main] INFO  com.test.redis.ReadWriteLockExample - Read lock count: 0

我使用 WSL (Windows 10) 在 Ubuntu 20.04.3 LTS 上的 Redis 服务器 6.2.5 上运行此示例。 不确定这是一个错误还是我遗漏了什么。

java redisson readwritelock

评论


答: 暂无答案