最近一段时间在作一个项目,项目中使用了大量的额时间格式转换,为了方便,就提取了一个时间操做的工具类,因为使用过于频繁,且处于压力测试,每一个不到三秒,甚至毫秒级的去调用时间工具类里的转换方法时,从后台服务器查到,上传的时间偶发性的异常,就是时间居然格式不对了,居然出现了 0001-02-22 12:30:26 的状况,我屮艸芔茻,这是什么状况,怎么时间回到了古代,公元1年?java
当时,我就怀疑,是否是操做过于频繁,线程不安全致使的?为此,修改了调用方式。果真,效果显著,居然压力测试几天,时间转换错误再也不出现了。看来确实是这个状况。当时,错误出现时,我用的是把 SimpleDateFormat 提取成全局变量,是 static 变量,在全局中直接先 new 好。这样的处理方式是不行的。android
今天,我在查看阿里巴巴 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。并发
最后,在小密圈分享这个小知识点,但愿可以对你们有所帮助,之后不会犯跟我同样的错误。ide
在这里强烈推荐你们看看阿里巴巴 Java 技术开发手册,没多少也就30多页,真的可以让大家收益颇丰。工具
欢迎你们关注个人技术分享公众号:非著名程序员(smart_android)。技术文章均先首发于个人技术分享的微信公众号。测试