这种情况有可能是获取不到锁,然后超时了。
tryLock()也是加锁,只是返回布尔值。
错误定位、分析
在项目中用到Redisson操控Redis集群实现分布式锁,加锁的请求第一次使用还是正常,第二次使用的时候发现会超时、并报错:远程主机强迫关闭了一个现有的连接。
于是就再写了一个测试接口来看看更多的情况。由于zipkin配置了只打印error级别的日志,所以这里就暂时使用sout来进行输出了。。。。
测试接口时发现锁并没有被释放,怪不得会超时。
首先熟悉Redisson的API的人可能知道,tryLock()的时候就已经回去加锁了,所以很显然是我的代码有问题。但是即使把tryLock()去掉,结果也依然是没有解锁。而之后再unlock()后面加多一个forceUnlock()才可以正常解锁,少了unlock也不行。
我觉得很奇怪。甚至反复去确认redis集群的配置、redisson配置的。后来再看了一遍demo代码,发现tryLock()和lock()总共锁了两次。而我值unlock了一次。。。。。。。被自己坑了一天(归根结底还是基础不扎实 T^T )
trylock和lock区别
trylock和lock都是加锁,两者都可以重入,区别在于:
- lock会阻塞等待
- trylock会直接返回结果
trylock实现机制(源码): https://www.jianshu.com/p/245fdb188e87