【前提】:使用多线程并发,每个线程获取表里不同Time字段的数据,然后执行业务逻辑代码。目标是让每个线程都能独立运行,互不干扰并发完成。
【代码】:
//线程池管理
ExecutorService es = Executors.newCachedThreadPool();
for(int i=1;i<months;i++){
final int j = i
Thread iThread = new Thread(new Runnable() {
@Override
public void run() {
//设置Time字段始末时间
Calendar cal = Calendar.getInstance();
cal.setTime(startTime);
cal.add(Calendar.MONTH, j-1);
Date start = cal.getTime();
cal.add(Calendar.MONTH, 1);
Date end = cal.getTime();
System.out.println(j+"."+sdf.format(start)+"-"+sdf.format(end));
//每个线程获取不同Time字段的数据
List<TmAppMain> list = TestGenerContractUtil.getMainByLstUpdTime(sdf.format(start), sdf.format(end));
//后续业务逻辑处理
for(TmAppMain appMain:list){
queueSender.synchAppStatus(appMain.getAppNo(), null, true);
}
}
});
es.execute(iThread);
}
【结果】:多线程获取数据list中出现重复混乱的情况
【原因】:多线程没有安全并发访问。TestGenerContractUtil 工具类是开发多线程前封装的,代码上可以看出TestGenerContractUtil 类里的方法 getMainByLstUpdTime 是静态方法。 类的所有实例共享同一个static 方法或变量,这就是多线程中引用 static修饰 导致的非安全的坑。