为什么说SimpleDateFormat是线程不安全的?

演示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是线程不安全的。

原创文章 358 获赞 387 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/105783926