今天排查组内的一段代码的,问题表现是并发很低,请求经常卡主不返还结果。 排查发现Service类没有定义Scope,也就是默认单例的Service,并且在Service中定义了成员变量CountDownLatch。代码大概如下:
按我的理解因为Service是单例,一个请求过来运行到lock.await()时候,
如果这时另一个请求过来执行lock=new CountDownLatch,这样老的请求执行完doSomeThing进行lock.countDown时无法对原有lock对象进行释放,导致一个线程一直阻塞在那。
按上述我这个想法的话,这个应用应该迟早会因线程全部阻塞耗尽,但他的表示是经常有请求卡主无返回,但又没有完全不可用,①请教是否tomcat或者其他地方有什么机制最终能释放阻塞的线程。
②另外请假这种多线程问题排查,有什么方法能在ide或者使用那些外部工具观察运行中的线程情况。
感谢不吝赐教!
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…