小编典典

关于线程安全的困惑-SimpleDateFormat示例

java

我对线程安全性有疑问。据我所知,SimpleDateFormat不是线程安全的。我想知道如果在spring控制器中以以下方式使用它会产生什么影响:

private final static SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd yyyy", Locale.US);

稍后在我的控制器功能中,我将其如下使用:

  try {
        changedate = changedate.substring(0, 15);                                                
        calcDate = dateFormat.parse(changedate);
    } catch (ParseException e2) {
        logger.error("Date Parsing Problem", e2); 
    }

然后将calcDate添加到我的模型对象中,并返回ModelAndView。

那么用这种方式我会看到什么样的问题呢?是否只需删除static关键字即可解决任何问题,因为每个线程将使用其自己的dateFormat实例?此主题在线程安全性方面的任何澄清都将受到赞赏。

谢谢


阅读 224

收藏
2020-11-16

共1个答案

小编典典

SimpleDateFormat.parse()使用称为的实例变量calendar从字符串构建日期。如果两个线程尝试同时解析,则calendar变量将变得混乱,并且您将得到错误的结果。

将变量设为非静态不一定有帮助,因为两个线程可能仍在使用同一控制器。更好的解决方案是在每次解析日期时创建一个新的DateFormat对象,或者使用线程本地存储。更好的是,使用具有线程安全解析器的JodaTime

2020-11-16