5

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

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

以及多个线程同时使用该方法的附加信息。这有什么问题吗?

我的回答是不,应该没问题(假设 //... 部分没有其他事情发生)。

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

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

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

4

2 回答 2

8

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

于 2012-11-16T09:57:48.517 回答
3

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

于 2012-11-16T10:12:53.670 回答