关于时间转换 SimpleDateFormat 的使用的问题

最近一段时间在作一个项目,项目中使用了大量的额时间格式转换,为了方便,就提取了一个时间操做的工具类,因为使用过于频繁,且处于压力测试,每一个不到三秒,甚至毫秒级的去调用时间工具类里的转换方法时,从后台服务器查到,上传的时间偶发性的异常,就是时间居然格式不对了,居然出现了 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)。技术文章均先首发于个人技术分享的微信公众号。测试

相关文章
相关标签/搜索