线程安全日期格式化操作的几种方式

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

线程不安全的处理方式
private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//线程不安全
这种方式会报如下异常:

java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Long.parseLong(Long.java:601)
    at java.lang.Long.parseLong(Long.java:631)
    at java.text.DigitList.getLong(DigitList.java:195)
    at java.text.DecimalFormat.parse(DecimalFormat.java:2051)
    at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:2162)
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1514)
    at java.text.DateFormat.parse(DateFormat.java:364)
    at com.concurrent.DateUtils.parse(DateUtils.java:28)
    at com.concurrent.DateUtils$2.run(DateUtils.java:42)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
线程安全的处理方式
方式一,每次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。







本文转自秋楓博客园博客,原文链接:http://www.cnblogs.com/rwxwsblog/p/6652743.html,如需转载请自行联系原作者
目录
相关文章
|
5月前
|
存储 安全 Java
线程安全问题的产生条件、解决方式
线程安全问题的产生条件、解决方式
37 0
|
7月前
|
安全 Java API
jdk8获取当前时间|时间加减|java8时间格式化|时间处理工具|时间比较|线程安全的时间处理方法
jdk8获取当前时间|时间加减|java8时间格式化|时间处理工具|时间比较|线程安全的时间处理方法
集合线程安全问题:第一章:集合类不安全之并发修改异常
集合线程安全问题:第一章:集合类不安全之并发修改异常
集合线程安全问题:第一章:集合类不安全之并发修改异常
|
安全
HashMap在多线程使用场景下会存在线程安全问题,怎么处理?
HashMap在多线程使用场景下会存在线程安全问题,怎么处理?
143 0
|
存储 安全 Java
解密SimpleDateFormat类的线程安全问题和六种解决方案!
提起SimpleDateFormat类,想必做过Java开发的童鞋都不会感到陌生。没错,它就是Java中提供的日期时间的转化类。这里,为什么说SimpleDateFormat类有线程安全问题呢?有些小伙伴可能会提出疑问:我们生产环境上一直在使用SimpleDateFormat类来解析和格式化日期和时间类型的数据,一直都没有问题啊!接下来,我们就一起看下在高并发下SimpleDateFormat类为何会出现安全问题,以及如何解决SimpleDateFormat类的安全问题。
1389 1
解密SimpleDateFormat类的线程安全问题和六种解决方案!
|
安全
【多线程: 变量的线程安全分析】
【多线程: 变量的线程安全分析】
116 0
|
Java
Java日期计算常用方法《简述版》
Java日期计算常用方法《简述版》
346 0
JAVA 获取系统当前时间、时间格式互相转化工具类
JAVA 获取系统当前时间、时间格式互相转化工具类
170 0
3、常用时间处理工具类
3、常用时间处理工具类
164 0
|
存储 安全 架构师
高并发之——SimpleDateFormat类的线程安全问题和解决方案
首先问大家一个问题:你使用的SimpleDateFormat类还安全吗?我们一起带着这个问题来看本文。
306 0