一条应用消息引起的多线程安全问题
问题描述:有用户反映收到了奇怪的消息推送,用户没有参加该培训,却收到该培训通知
冷静思考,追根溯源,蛛丝马迹,灵光一闪,接近真相,最后发现这是自己写的bug

代码大致如下:
public class NoticeTemplateContent {
public static List<NoticeTemplate> list = new ArrayList();
public static String userName="userName";//姓名
public static String periodName="periodName";//期次名
public static String courseName="courseName";//课程名
public static String number="number";//第几个
public static String dateTime="dateTime";//时间
public static String day="day";//哪一天
public static String week="week";//星期几
static {
NoticeTemplate noticeTemplate1 = new NoticeTemplate();
noticeTemplate1.setId("1");
noticeTemplate1.setNoticeBusinessTypeEnum(NoticeBusinessTypeEnum.RECENT_NO_LEARN);
noticeTemplate1.setTitle("近期未听课提醒");
noticeTemplate1.setContent(userName+"你好,你参加的"+periodName+",近期未按时听课,请按时参加学习培训,以免影响毕业。");
noticeTemplate1.setNote("(注:userName:学员姓名,periodName:期次名称)");
noticeTemplate1.setReadOnly(true);
noticeTemplate1.setShow(true);
list.add(noticeTemplate1);
NoticeTemplate noticeTemplate4 = new NoticeTemplate();
noticeTemplate4.setId("4");
noticeTemplate4.setNoticeBusinessTypeEnum(NoticeBusinessTypeEnum.AUTH_NO_PASS);
noticeTemplate4.setTitle("实名认证未通过");
noticeTemplate4.setContent(userName+"你好,你的实名认证信息未审核通过,请及时修改。");
noticeTemplate4.setNote("(注:userName:学员姓名)");
noticeTemplate4.setReadOnly(true);
noticeTemplate4.setShow(false);
list.add(noticeTemplate4);
}
public static NoticeTemplate getMyExample(String id){
for(int i = 0;i<=list.size();i++){
if(list.get(i).getId().equals(id)){
return list.get(i);
}
}
return null;
}
}
如上:
我在静态方法中使用了静态变量成员list,list储存在方法区中,被所有线程所共享,所以出现了线程安全问题(怪自己当初没考虑多线程情况)
将变量list改成在静态方法中创建,这样每个线程都创建自己的一份

浙公网安备 33010602011771号