怎么进行线程安全的日期格式化操作?

由于 DateFormat 是非线程安全的,因此在多线程并发情况下日期格式化时需要特别注意。下面记录几种格式化的方式:

线程不安全的处理方式

private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//线程不安全

这种方式会报如下异常:

image.png

线程安全的处理方式

方式一,每次new一个对象

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

方式二,通过ThreadLocal进行处理

private static final ThreadLocal<DateFormat> LOCAL_DATE_FORMAT = new ThreadLocal<DateFormat>(){       
                 @Override
        protected DateFormat initialValue() {            
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        }
    };
  • 如果是JDK7及以下的应用,可用ThreadLocal的方式

方式三,java8 通过 DateTimeFormatter 进行处理

private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse(date, DATE_TIME_FORMATTER);
LOCAL_DATE_FORMAT.get().parse(date);
  • 如果是JDK8的应用,可以使用instant代替Date,Localdatetime代替Calendar,

    Datetimeformatter代替Simpledateformatter,官方给出的解释:simple beautiful strong immutable thread-safe。

猜你喜欢

转载自blog.csdn.net/belalds/article/details/83304695