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

Posted on 2020-01-02 20:03  叶乐乐  阅读(354)  评论(1编辑  收藏  举报

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

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

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

 

 

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

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

Copyright © 2024 叶乐乐
Powered by .NET 8.0 on Kubernetes