我有一个关于线程安全的问题。据我所知,SimpleDateFormat 不是线程安全的。我想知道如果我在我的 spring Controller 中使用它会产生什么效果:
private final static SimpleDateFormat dateFormat = new SimpleDateFormat("EEE MMM dd yyyy", Locale.US);
稍后在我的 Controller 功能中,我按如下方式使用它:
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
变量会被破坏,你会得到错误的结果。
使变量不是静态的不一定有帮助,因为两个线程仍然可以使用同一个 Controller 。更好的解决方案是在每次解析日期时创建一个新的 DateFormat 对象,或者使用线程本地存储。更好的是,使用 JodaTime它具有线程安全的解析器。
关于java - 关于线程安全的困惑 - SimpleDateFormat 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5652518/