javasimpledateformat线程的安全问题

  介绍

这篇文章主要讲解了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 ();
  }
  }
  }

测试结果如下:

 javasimpledateformat线程的安全问题

那有没有好的解决方案呢,既不用重复创建对象,又保证线程安全呢?答案是有。

方法一:使用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线对程的安全问题有进一步的了解,如果还想学习更多内容,欢迎关注行业资讯频道。

javasimpledateformat线程的安全问题