我对线程安全性有疑问。据我所知,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实例?此主题在线程安全性方面的任何澄清都将受到赞赏。
谢谢
SimpleDateFormat.parse()使用称为的实例变量calendar从字符串构建日期。如果两个线程尝试同时解析,则calendar变量将变得混乱,并且您将得到错误的结果。
SimpleDateFormat.parse()
calendar
将变量设为非静态不一定有帮助,因为两个线程可能仍在使用同一控制器。更好的解决方案是在每次解析日期时创建一个新的DateFormat对象,或者使用线程本地存储。更好的是,使用具有线程安全解析器的JodaTime。