演示SimpleDateFormat是线程不安全的的示例代码
public class SpringbootApplication {
static ExecutorService executorService = Executors.newFixedThreadPool(10);
//SimpleDateFormat
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//搞个set,去重做个数据统计
static Set<String> set = new HashSet();
//测试的方法
public static String addDate(int seconds) {
Date date = new Date(1000 * seconds);
String result = sdf.format(date);
return result;
}
}
public static void main(String[] args) throws Exception {
for (int i = 0; i < 100; i++) {
int a = i;
executorService.execute(new Runnable() {
@Override
public void run() {
String result = addDate(a);
System.out.println(result);
set.add(result);
}
});
}
//给个5秒的休眠期,方便子线程都运行完
TimeUnit.SECONDS.sleep(5);
System.out.println(set.size());
}
}
运行结果:
可以发现,运行了2次,set集合里面的数目都是不同的,每次运行的结果都不同,这肯定说不上是线程安全。
在方法里加个synchronized关键字再试试:
public static String addDate(int seconds) {
Date date = new Date(1000 * seconds);
synchronized (SpringbootApplication.class) {
String result = sdf.format(date);
return result;
}
}
运行了两次,set集合里面的数目都是100,和我们循环的次数是一样的,符合预期。
总结
通过多次的运行结果,以及加上synchronized关键字后的效果比较,可以确定SimpleDateFormat是线程不安全的。