Redisson的读写锁RReadWriteLock写写锁、写读锁使用不互斥阻塞问题

一. 读写锁RReadWriteLock写写锁、写读锁使用不互斥阻塞问题

在测试redisson的读写锁RReadWriteLock时,发现写写锁、写读锁不互斥阻塞。同样的线程代码在测试JUC下的读写锁ReentrantReadWriteLock,则不存在写写锁、写读锁不互斥阻塞问题。
一度怀疑redisson版本问题,换了几个版本存在同样的问题。 后来发现程序执行时间超过锁定看门狗超时时间(config.setLockWatchdogTimeout),会引起写写锁、写读锁不互斥阻塞. 这个问题找了N久!!!!!!

二. lockWatchdogTimeout 参数作用

如果获取锁的 Redisson 实例崩溃,则此类锁可以永远处于获取状态。为了避免这种情况 Redisson 维护锁看门狗,它会在锁持有人 Redisson 实例处于活动状态时延长锁过期时间。默认情况下,锁定看门狗超时为 30 秒,可以通过 Config.lockWatchdogTimeout 设置进行更改。

三. 测试代码

RedissonUtil

public class RedissonUtil {
   
    public static RedissonClient redissonClient;
    static {
   
        Config config = new Config();
        config.setLockWatchdogTimeout(60) //锁定看门狗超时设置
                .useSingleServer()
                .setAddress("redis://192.168.64.130:6379")
                .setDatabase(1);
        redissonClient = Redisson.create(config);
    }

    public RedissonClient getRedissonClient() {
   
        return redissonClient;
    }
}

BaseTest

public class BaseTest {
   
    protected RedissonClient redissonClient;
    @Before
    public  void init(){
   
        RedissonUtil redissonUtil = new RedissonUtil();
        redissonClient = redissonUtil.getRedissonClient();
    }

    protected void sleep(long time){
   
        try {
   
            Thread.sleep(time);
            System.out.println(Thread.currentThread().getName()+" 线程等待,"+ time);
        } catch (InterruptedException e) {
   
            throw new RuntimeException(e);
        }
    }
}

TestReentrantReadWriteLock

public class TestReentrantReadWriteLock extends BaseTest {
   
    static String us ="00000";
    @Test
    public void  testReadWriteLock(){
   
        ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(false);

        Thread thread1 = new Thread(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值