我从程序员测试中得到了以下代码
private String formatDate(Date date)
{
String result = "";
//….
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
result = sdf.format(date);
//…
return result;
}
使用多个线程一次使用该方法的附加信息。这有什么问题吗?
我的回答是,不,它应该没问题(假设//部分没有其他任何内容)。
我的动机是没有使用全局或类数据结构。日期作为参数从每个胎面传递,并且在方法内部仅使用局部变量和局部对象。因此,每个线程将获得并使用它自己的SimpleDateFormat类的对象实例。
然而,这不是测试中的“正确”答案。 “正确”的答案是,SimpleDateFormat类不是线程安全的,因此需要同步对该对象的访问。
那么,我或解决方案是否正确?
答案 0 :(得分:8)
你的答案是对的。 SimpleDateFormat不是线程安全的,但是每个方法调用都会创建一个自己的实例,所以这没关系。如果SimpleDateFormat是一个实例变量,那么这将不是线程安全的(如你所提到的)。
答案 1 :(得分:3)
SimpleDateFormatter
不是问题 - 这是一个局部变量,无法从多个线程访问它,因为它不会暴露给外部。真正的问题是Date
参数(正如@Marko Topolnik已经说过的那样)。这个对象可以传递给方法和一些线程,它可以在formatDate
方法执行过程中修改它。您可以使用long
作为参数类型来阻止datarace。要将Date
转换为long
使用Date.getTime()
方法并从Date
创建long
,您可以使用new Date(long)
构造函数。