spring项目中Service非线程安全使用CountDownLatch为什么没有完全耗尽应用的工作线程

发布于 2022-09-12 04:38:31 字数 533 浏览 29 评论 0

今天排查组内的一段代码的,问题表现是并发很低,请求经常卡主不返还结果。 排查发现Service类没有定义Scope,也就是默认单例的Service,并且在Service中定义了成员变量CountDownLatch。代码大概如下:

image

按我的理解因为Service是单例,一个请求过来运行到lock.await()时候,
如果这时另一个请求过来执行lock=new CountDownLatch,这样老的请求执行完doSomeThing进行lock.countDown时无法对原有lock对象进行释放,导致一个线程一直阻塞在那。

按上述我这个想法的话,这个应用应该迟早会因线程全部阻塞耗尽,但他的表示是经常有请求卡主无返回,但又没有完全不可用,请教是否tomcat或者其他地方有什么机制最终能释放阻塞的线程。

另外请假这种多线程问题排查,有什么方法能在ide或者使用那些外部工具观察运行中的线程情况。

感谢不吝赐教!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

<逆流佳人身旁 2022-09-19 04:38:31

1.如果你只是浏览器页面点击,应该是并发度还不够高,看代码只有
a. 前一个lock在await,还没有countdown;
b. 新进来一个请求,改变了lock的引用。
这种情况才会堵塞一个线程。

  1. java自带的visualvm和jstack 指令都可以查看线程情况,
  2. 如果使用的CountDownLatch,最好是把它作为方法内局部变量,而不是把service改为多例(大对象,也没必要)。如果是用锁的话不应该使用CountDownLatch应该用ReentranLock比较合适。CountDownLatch比较适合一起运行一批任务,等待所有完成后再向下执行
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文