SimpleDateFormat类是非线程安全的
public class MyThread extends Thread{
private SimpleDateFormat sdf;
private String dateString;
public MyThread(SimpleDateFormat sdf,String dateString){
this.sdf = sdf;
this.dateString = dateString;
}
@Override
public void run(){
try {
//Date dateRef = DateTools.getSimpleDateFormat("yyyy-MM-dd").parse(dateString);
//String newString = DateTools.getSimpleDateFormat("yyyy-MM-dd").format(dateRef).toString();
Date dateRef = sdf.parse(dateString);
String newString = sdf.format(dateRef).toString();
if(!newString.equals(dateString)){
System.out.println(Thread.currentThread().getName()+">>日期不一致:"+dateString+"不等于"+newString);
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}
public class Test {
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String[] dateArr = new String[]{"2019-01-01","2019-02-01","2019-03-01",
"2019-04-01","2019-05-01","2019-06-01","2019-07-01"};
MyThread[] ts = new MyThread[7];
for(int i = 0;i<7;i++){
ts[i] = new MyThread(sdf,dateArr[i]);
}
for(int i = 0;i<7;i++){
ts[i].start();
}
}
}
运行结果
解决办法
public class DateTools {
private static ThreadLocal<SimpleDateFormat> t1 = new ThreadLocal<SimpleDateFormat>();
public static SimpleDateFormat getSimpleDateFormat(String datePattern){
SimpleDateFormat sdf = null;
sdf = t1.get();
if(sdf == null){
sdf = new SimpleDateFormat(datePattern);
t1.set(sdf);
}
return sdf;
}
}
把run方法改一下
@Override
public void run(){
try {
Date dateRef = DateTools.getSimpleDateFormat("yyyy-MM-dd").parse(dateString);
String newString = DateTools.getSimpleDateFormat("yyyy-MM-dd").format(dateRef).toString();
if(!newString.equals(dateString)){
System.out.println(Thread.currentThread().getName()+">>日期不一致:"+dateString+"不等于"+newString);
}
} catch (ParseException e) {
e.printStackTrace();
}
}
ThreadLocal就像全局存放数据的盒子,盒子可以存储每个线程的私有数据。