当前位置: 首页 > 知识库问答 >
问题:

以下日期格式化代码线程是否安全?

傅鸿波
2023-03-14

我在几个地方读到过SimpleDateFormat不是线程安全的,但是线程是一个对我来说仍然不清楚的概念,所以我想知道下面的代码是不是线程安全的;

static public java.util.Date stringToDate(String strDate, String pattern)
            throws ParseException {
        if (strDate == null || strDate.trim().equals("")) {
            return null;
        } else {
            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
            return new java.util.Date(sdf.parse(strDate).getTime());
        }
    }

这是一个驻留在名为“dateutils.java”的类中的方法,在我正在处理的Spring Boot应用程序中,我使用dateutils.StringToDate...访问它,只要我需要将字符串转换为日期(如果转换失败,则将异常传递给控制器)。

由于这个方法在每次调用时都使用SimpleDateFormat的一个新实例,所以我认为它是线程安全的,但是我在这里提出这个问题是为了在我错了的时候更正。我不能百分之百确定的主要原因是,尽管dateutils类的实例在每个方法调用中都是一个新实例,但它(我认为它甚至不是一个实例,因为它一开始就没有初始化,如果我在这里也错了,请纠正我)在应用程序运行时是共享的。

谢谢你。

共有1个答案

白烨煜
2023-03-14

简单的回答是,您正在做的是绝对线程安全的,因为:

  • 您没有对全局状态进行任何更改。
  • 您正在使用所有局部变量
  • 方法接受字符串作为不可变的输入
  • 最终返回的是“可变”日期对象,但使用的是“防御性复制”。

由于这个方法在每次调用时都使用SimpleDateFormat的一个新实例,所以我认为它是线程安全的,但是我在这里提出这个问题是为了在我错了的时候更正。

我不能百分之百确定的主要原因是,即使它在每个方法调用中都是一个新实例,但DateUtils类的实例(我认为它甚至不是一个实例,因为它一开始就没有初始化,如果我在这里也错了,请纠正我)在应用程序运行时是共享的。

您的方法StringToDate是静态的,这基本上意味着要访问此方法,您不需要DateUtils的任何对象,这不会导致任何并发/线程安全问题,除非您:

  • 您正在访问全局状态,并在没有任何同步的情况下对全局状态进行任何更改
  • 您接受可变对象作为方法参数,并且在处理它们之前不要使用“防御性复制”
  • 最终返回一个“可变”对象,而不进行“防御性复制”。
 类似资料:
  • 问题内容: 什么是最好的在线代码美化器和格式化器?我不是在要求荧光笔。任何语言都可以。 问题答案: CSS:代码美化器 HTML:HTML Tidy,CleanUp HTML或通用的Pretty Diff Javascript:http://jsbeautifier.org/ PHP:http://beta.phpformatter.com/ SQL:http://dpriver.com/pp/s

  • 主要内容:DateFormat 类,SimpleDateFormat 类格式化日期表示将日期/时间格式转换为预先定义的日期/时间格式。例如将日期“Fri May 18 15:46:24 CST2016” 格式转换为 “2016-5-18 15:46:24 星期五”的格式。 在 Java 中,可以使用 DateFormat 类和 SimpleDateFormat 类来格式化日期,下面详细介绍这两个格式化日期类的使用。 DateFormat 类 DateFormat 是日

  • Parameter Position Type Required Default Description 1 string No %b %e, %Y This is the format for the outputted date. 输出日期的格式。 2 string No n/a This is the default date if the input is empty. 输入为空时的默认时

  • 我想在获得,和。 这是一条漫长的道路: 我的问题:如何将最后一部分压缩到函数? 我想归档的内容: p/s:的含义与标准数字格式字符串相同。像C#语法:

  • 问题内容: 我知道日期格式,例如 -以格式 显示日期-以格式显示日期 用于例如: 我想要一种可以帮助我显示星期几之类的格式。我只希望将星期几与月份和年份一起显示。你能告诉我这样的格式吗? 问题答案: 这应该显示“ Tue”: 这应该显示“星期二”: 这应该显示“ T”: 因此,您的具体示例为:

  • 问题内容: 我正在使用JDT生成一些类。之后,我想格式化整个ICompilationUnit,就像我在没有选择的打开的编辑器中按Ctrl + Shift + F(源>格式)一样。 高度赞赏JDT中用于以编程方式格式化源代码的API的任何指针。 另外:我像这样尝试过,但是代码没有改变。我在说什么 问题答案: 这可能是一个错误,但是使用Elcipse 4.2.2中的JDK时,有必要创建ICompila