【发布时间】:2012-11-16 09:54:54
【问题描述】:
我从程序员测试中得到以下代码
private String formatDate(Date date)
{
String result = "";
//….
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
result = sdf.format(date);
//…
return result;
}
带有多个线程同时使用该方法的附加信息。这有什么问题吗?
我的回答是不,应该没问题(假设 //... 部分没有其他事情发生)。
我的动机是不使用全局或类数据结构。日期作为参数从每个踏板传递,在方法内部仅使用局部变量和局部对象。因此,每个线程都将获取并使用它自己的 SimpleDateFormat 类的对象实例。
但是,这不是测试中的“正确”答案。 “正确”的答案是 SimpleDateFormat 类不是线程安全的,因此需要同步对该对象的访问。
那么,我或解决方案是否正确?
【问题讨论】:
-
“正确”的答案不正确。然而,传入的
Date也不安全,并且由于它是从外部接收的,因此可能会出现数据争用问题。 -
SimpleDateFormat是一个真正的猪,因为它是 a) 线程不安全的; b) 初始化缓慢。必须缓存一个线程本地实例,这是最糟糕的选择。 -
@MarkoTopolnik 恕我直言,“慢”在这种情况下是一个被过度使用的术语。只要您不遇到性能问题,我总是更喜欢方法本地对象的简单性,而不是使用 ThreadLocal,这对于许多开发人员来说仍然是一本封闭的书
-
@Korgen
SimpleDateFormats 设计对性能的影响限制了它的用例。这并不意味着此类的每次使用都会出现性能问题。 -
我仍然看不到他们不在 SimpleDateFormat 内部使用 ThreadLocal 的原因,因此我们不必这样做。这将符合性能约束,并且该类将是线程安全的。
标签: java thread-safety simpledateformat