文章目录
一. 读写锁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(