SimpleDateFormat非线程安全

SimpleDateFormat非线程安全主要原因是parse()方法使用calendar来生成返回的Date实例,而每次parse之前,都会把calendar里的相关属性清除掉。

问题是这个calendar是个全局变量,也就是线程共享的。因此就会出现一个线程刚把calendar设置好,另一个线程就把它给清空了,这时第一个线程再parse的话就会有问题了。

解决方案:1. 每次使用时创建一个新的SimpleDateFormat实例;

       2. 创建一个共享的SimpleDateFormat实例变量,并对这个变量进行同步;

      

   private static synchronized SimpleDateFormat simpleDateFormat = new SimpleDateFormat();

 

             3. 使用ThreadLocal为每个线程都创建一个独享的SimpleDateFormat实例变量。

   private static final ThreadLocal<SimpleDateFormat> simpleDateFormat = new ThreadLocal<SimpleDateFormat>();
    private static ThreadLocal<SimpleDateFormat> simpleDateFormat1 = new ThreadLocal<SimpleDateFormat>();
    
    public static String getTodayStr(long cur) {
        SimpleDateFormat format = simpleDateFormat1.get();
        if (null == format) {
            format = new SimpleDateFormat("yyyy-MM-dd");
            simpleDateFormat1.set(format);
        }
        return format.format(new Date(cur));
    }
    
    public static long parseDate(String str) {
        SimpleDateFormat format = simpleDateFormat.get();
        if (null == format) {
            format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            simpleDateFormat.set(format);
        }
        try {
            str = str.replace(":", ":");
            return format.parse(str).getTime();
        } catch (Exception e) {
            throw new RuntimeException("时间格式错误:" + str, e);
        }
    }

 

posted @ 2018-03-29 18:33  提拉没有米苏  阅读(166)  评论(0编辑  收藏  举报