问题描述:有用户反映收到了奇怪的消息推送,用户没有参加该培训,却收到该培训通知
冷静思考,追根溯源,蛛丝马迹,灵光一闪,接近真相,最后发现这是自己写的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储存在方法区中,被所有线程所共享,所以出现了线程安全问题(怪自己当初没考虑多线程情况)