关于SimpleDateFormat线程不安全的解决办法

在需要的时候创建实例

public static String format(Date date) throws Exception {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    return sdf.format(date);
}

public static Date parse(String strDate) throws Exception {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    return sdf.parse(strDate);
}

缺点:每次调用方法都要创建和销毁sdf对象,效率较低。

synchronized

private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

public static String format(Date date) throws Exception {
    synchronized(sdf){
        return sdf.format(date);
    }
}

public static Date parse(String strDate) throws Exception {
    synchronized(sdf){
        return sdf.parse(strDate);    
    }
}

缺点:并发量大时线程阻塞,对性能有影响。

ThreadLocal

ThreadLocal可以让每个线程都得到一个sdf对象

private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() {
    @Override
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    }
};

public static Date parse(String strDate) throws Exception {
    return threadLocal.get().parse(strDate);
}

public static String format(Date date) throws Exception {
    return threadLocal.get().format(date);
}

基于JDK1.8的DateTimeFormatter(线程安全的类)

private static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

public static String format(LocalDateTime date) throws Exception {
    return dtf.format(date);
}

public static LocalDateTime parse(String strDate) {
    return LocalDateTime.parse(strDate, dtf);
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、 昨晚接到林姐的电话,我问她,年底很忙很累吧?她一脸轻松地说,其实还好,因为项目上有小王帮忙撑着。 小王和林姐...
    i一梦阅读 400评论 0 2
  • 我很喜欢一首歌叫做越长大越孤单,孤单是不安的,无处安放的情绪,我们会时常不知道自己想要什么,甚至有时会开始...
    吖了个哒阅读 253评论 0 1
  • 一、学习与实践 1.付出不亚于任何人的努力 2.要谦虚,不要骄傲 3.要每天反省 4.活着,就要感谢 5.积善行,...
    grace2039阅读 168评论 0 2
  • 思想力家庭教育:孩子“偷拿”爸爸妈妈的钱,我们该怎么办? 今天我们和大家分享一个话题:孩子“偷拿”爸爸妈妈的钱,我...
    芒果遇见茶阅读 644评论 0 0