最近一段时间在做一个项目,项目中使用了大量的额时间格式转换,为了方便,就提取了一个时间操作的工具类,由于使用过于频繁,且处于压力测试,每个不到三秒,甚至毫秒级的去调用时间工具类里的转换方法时,从后台服务器查到,上传的时间偶发性的异常,就是时间竟然格式不对了,竟然出现了 0001-02-22 12:30:26 的情况,我屮艸芔茻,这是什么情况,怎么时间回到了古代,公元1年?
当时,我就怀疑,是不是操作过于频繁,线程不安全导致的?为此,修改了调用方式。果然,效果显著,竟然压力测试几天,时间转换错误不再出现了。看来确实是这个情况。当时,错误出现时,我用的是把 SimpleDateFormat 提取成全局变量,是 static 变量,在全局中直接先 new 好。这样的处理方式是不行的。
今天,我在查看阿里巴巴 Java 技术开发手册时,竟然看到了里面也有这方面的知识,果然,大公司就是考虑周到,竟然在开发手册的并发处理中说到了 SimpleDateFormat 的使用。手册里是这么说的:
SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为 static,必须加锁,或者使用 DateUtils 工具类。
而阿里巴巴推荐使用的方式如下:
正例:注意线程安全,使用 DateUtils。亦推荐如下处理:
private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd");
}
};
说明:如果是 JDK8 的应用,可以使用 instant 代替 Date,Localdatetime 代替 Calendar, Datetimeformatter 代替 Simpledateformatter,官方给出的解释:simple beautiful strong immutable thread-safe。
最后,在小密圈分享这个小知识点,希望能够对大家有所帮助,以后不会犯跟我一样的错误。
在这里强烈推荐大家看看阿里巴巴 Java 技术开发手册,没多少也就30多页,真的能够让你们收益颇丰。