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

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

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

线程不安全的处理方式

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

这种方式会报如下异常:

0457a4855f3fe5d2da66077e77e2246d.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 LOCAL_DATE_FORMAT = new ThreadLocal(){ @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。

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值