一次排查多线程问题的记录

Posted yelele

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一次排查多线程问题的记录相关的知识,希望对你有一定的参考价值。

最近遇到一个导出pdf报文件不存在的异常,查看代码后,发现导出pdf需经四个步骤:生成临时pdf、填充pdf内容、下载至客户端、删除pdf。报文件不存在异常的代码定位到下载至客户端这个步骤。于是,就有了一个猜想:多线程引发的问题。

猜测导致这个异常的具体行为是A和B都要导出这个pdf,但是B比A晚一点,结果A正常导出了,B在下载至客户端这个步骤的时候,发现这个pdf文件已经被A导出的线程删除了,于是就会报文件不存在的异常。

为了证实这个猜想,使用jmeter测试工具模拟六个用户同时100次请求的情况,根据日志打印,果然是这个情况。日志截图如下:

技术图片

 

 

从日志中可以看出487这个线程把文件删除了,485再去下载的时候就会报文件找不到的异常

解决问题的思路就是把临界资源变成非临界资源,于是我们一开始的做法是在文件名上添加一个时间戳,后来发现也会有重名现象即变成临界资源。后续加了一个UUID(一台机器时空上唯一的序列号),就不会再重名了,即非临界资源。至此问题解决。

以上是关于一次排查多线程问题的记录的主要内容,如果未能解决你的问题,请参考以下文章

一次排查Jvm线程飙升问题的经历

多线程 - Java 多线程编程排查异常技巧

java多线程死锁及死锁问题排查

多线程编程:多线程并发制单的开发记录

多线程基础

python多线程应用挂起