今天配合同事一起和外部系统进行联调测试,其实昨天我们已经成功走通了一遍。今天同事得到对方反馈系统可能有一个潜在的问题,所以就又严格地联调了一遍。这一遍,我也是一遍又一遍地盯日志,关注告警邮件。正是在这一遍联调系统中,我发现了一个小问题,程序里面一封相同内容的通知邮件,几乎是同一个时间发送了两次。
通过分析日志外加比对代码,终于找到问题,是遇到线程安全问题引起的。下面和大家分享一下,伪代码:
public class Email{
private String emailContent;
@Async
public void sendEmail(){
"send email" + emailContent;
}
}
//Email类的实例被Spring容器管理,只有一个实例emailInstance。
public class TestDemo{
@Resource
Email emailInstance;
@Async
public void testMethod(){
lock();
//处理业务逻辑,同时操作emailInstance.emailContent;
operationBs();
emailInstance. sendEmail();
unlock();
}
}
问题原因复述:testMethod方法为防止多线程同时操作,在此处使用了锁,而为了确保发送邮件不影响主