SimpleDateFormat的线程安全问题

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

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

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

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

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

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

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

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

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