这种情况有可能是获取不到锁,然后超时了。
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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐