介绍
这篇文章主要讲解了javasimpledateformat线程的安全问题,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
今天百度一些资料偶然发现SimpleDateFormat居然不是线程安全的,平时使用时根本没有考虑,万幸今天发现了这个问题,得把写的代码得翻出来整理一下了。
一般我们使用的SimpleDateFormat一般是这样写的:
公共void方法(){ … DateFormat DateFormat=new SimpleDateFormat (“yyyy-MM-dd HH: mm: ss"); 日期日期=dateFormat.parse (“2020-05-10 19:53:00"); … }
这样写完全没有任何问题,但我们有时候会觉得重复创建SimpleDateFormat耗费性能,就想到把SimpleDateFormat对象做为类的静态成员变量,那么代码就是这样了:
私有静态最终DateFormat DateFormat=new SimpleDateFormat (“yyyy-MM-dd HH: mm: ss"); 公共空间的方法(){ … 日期日期=dateFormat.parse (“2020-05-10 19:53:00"); … }
我经常在控制器做日期转换的时候就是这么干的,但这样写很有问题,多线程通知执行容易出问题,要么转换后的结果不对,要么报错,我们测试一下:
公共类DateUtils { 私有静态最终DateFormat DateFormat=new SimpleDateFormat (“yyyy-MM-dd HH: mm: ss"); 公共静态日期绿石英(String日期)抛出ParseException { 返回dateFormat.parse(日期); } 静态类工作线程{延伸 @Override 公共空间run () { 尝试{ System.out.println (this.getName () +“:“+ DateUtils.prase (“2020-05-10 19:53:00")); }捕捉(ParseException e) { } } } 公共静态void main (String [] args) { for (int i=0;我& lt;10;我+ +){ 新工作().start (); } } }
测试结果如下:
那有没有好的解决方案呢,既不用重复创建对象,又保证线程安全呢?答案是有。
方法一:使用ThreadLocal
公共类MyController { 私有静态ThreadLocal当地=new ThreadLocal () { 保护DateFormat initialValue () { 返回新SimpleDateFormat (“yyyy-MM-dd HH: mm: ss"); }; }; 公共空间的方法(){ … 日期日期=local.get () .parse (“2020-05-10 19:53:00"); … } }
方法二:使用第三方apache提供工具包commons-lang3
进口org.apache.commons.lang3.time.FastDateFormat; 公开课MyController { 公共空间的方法(){ … 日期日期=FastDateFormat.getInstance (“yyyy-MM-dd HH: mm: ss") .parse (“2020-05-10 19:53:00"); … } }
推荐使用第二种,既快有方便。
看完上述内容,是不是javasimpledateformat线对程的安全问题有进一步的了解,如果还想学习更多内容,欢迎关注行业资讯频道。