SimpleDateFormat线程不安全问题解决及替换方法

2019-08-16 10:01:21来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

SimpleDateFormat线程不安全问题解决及替换方法

Posted on 2019-07-09 09:41 Leespoch 阅读(...) 评论(...) 编辑 收藏

    场景:在多线程情况下为避免多次创建SimpleDateForma实力占用资源,将SimpleDateForma对象设置为static。

 出现错误:SimpleDateFormat定义为静态变量,那么多线程下SimpleDateFormat的实例就会被多个线程共享,B线程会读取到A线程的时间,就会出现时间差异和其它各种问题。SimpleDateFormat和它继承的DateFormat类也不是线程安全的。

 错误原因:SimpleDateFormat的format()方法的源码,实际操作的是 calendar.setTime(date)。

 假设线程A执行完calendar.setTime(date),把时间设置成2019-01-02,这时候被挂起,线程B获得CPU执行权。线程B也执行到了calendar.setTime(date),把时间设置为2019-01-03。线程挂起,线程A继续走,calendar还会被继续使用(subFormat方法),而这时calendar用的是线程B设置的值了,而这就是引发问题的根源,出现时间不对,线程挂死等等。

 解决方案:

   1 ThreadLocal可以确保每个线程都可以得到单独的一个SimpleDateFormat的对象

   
private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() {

        
@Override

        
protected DateFormat initialValue() {            
  return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        }

    };



    
public static Date parse(String dateStr) throws ParseException
 {       
return threadLocal.get().parse(dateStr);

  }



    
public static String format(Date date) {        
  return threadLocal.get().format(date);

}

  2 基于JDK1.8的DateTimeFormatter

  

public static String formatDate2(LocalDateTime date) {        
 return formatter.format(date);

}
public static LocalDateTime parse2(String dateNow) {        
    return LocalDateTime.parse(dateNow, formatter);

}

参考原文:http://blog.itpub.net/69900354/viewspace-2629912/


原文链接:https://www.cnblogs.com/Leesopch/p/11155458.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:数组_array

下一篇:多线程高并发内容聚合