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

标签 java spring thread-safety

我有一个关于线程安全的问题。据我所知,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/

相关文章:

java - 如果不存在则插入到数据库

spring - 如何修复tomcat中的这个Spring MVC启动异常?

java - 线程 volatile

java - 使用流式传输时如何关闭Mule中FTP入站端点的输入流

java - SQL和Java的日期比较

java - NoClassDefFoundError sun/io/ByteToCharConverter 与 InterBase JDBC 驱动程序

java - Spring Security 按角色获取用户列表

java - 如何让 Spring Boot API 返回 MySQL 日期值的 UTC 时间而不是 "2018-08-01T04:00:00Z"?

java - 来自 Spring JPA 的 Iterable 结果的 Spliterators 是否可以安全地用于 parallelStream

Python:os.read()/os.write() 在 os.pipe() 线程安全吗?