一条应用消息引起的多线程安全问题

问题描述:有用户反映收到了奇怪的消息推送,用户没有参加该培训,却收到该培训通知

冷静思考,追根溯源,蛛丝马迹,灵光一闪,接近真相,最后发现这是自己写的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储存在方法区中,被所有线程所共享,所以出现了线程安全问题(怪自己当初没考虑多线程情况)

猜你喜欢

转载自www.cnblogs.com/changingLife/p/12918145.html
今日推荐