SimpleDateFormat的线程安全问题

时间:2012-11-16 09:54:54

标签: java thread-safety simpledateformat

我从程序员测试中得到了以下代码

private String formatDate(Date date)
{
  String result = "";
  //….
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  result = sdf.format(date);
  //…
  return result;
}

使用多个线程一次使用该方法的附加信息。这有什么问题吗?

我的回答是,不,它应该没问题(假设//部分没有其他任何内容)。

我的动机是没有使用全局或类数据结构。日期作为参数从每个胎面传递,并且在方法内部仅使用局部变量和局部对象。因此,每个线程将获得并使用它自己的SimpleDateFormat类的对象实例。

然而,这不是测试中的“正确”答案。 “正确”的答案是,SimpleDateFormat类不是线程安全的,因此需要同步对该对象的访问。

那么,我或解决方案是否正确?

2 个答案:

答案 0 :(得分:8)

你的答案是对的。 SimpleDateFormat不是线程安全的,但是每个方法调用都会创建一个自己的实例,所以这没关系。如果SimpleDateFormat是一个实例变量,那么这将不是线程安全的(如你所提到的)。

答案 1 :(得分:3)

SimpleDateFormatter不是问题 - 这是一个局部变量,无法从多个线程访问它,因为它不会暴露给外部。真正的问题是Date参数(正如@Marko Topolnik已经说过的那样)。这个对象可以传递给方法和一些线程,它可以在formatDate方法执行过程中修改它。您可以使用long作为参数类型来阻止datarace。要将Date转换为long使用Date.getTime()方法并从Date创建long,您可以使用new Date(long)构造函数。