为什么有人需要线程安全的SimpleDateFormat对象?

时间:2014-05-08 07:22:28

标签: java multithreading simpledateformat

我一直在寻找ThreadLocal的使用并登陆这个热门网页When and how should I use a ThreadLocal variable?

接受的最高投票回答说

  

一种可能的(和常见的)用法是当你有一些非线程安全的对象,但你想避免同步对该对象的访问(我在看你,SimpleDateFormat)。

代码的核心部分是

 return new SimpleDateFormat("yyyyMMdd HHmm");

哪个不会改变或受到并发执行的影响,或者它会不会?

你能否强调这可能是一个问题?为什么我们需要一个线程安全对象?

在其他情况下,我遇到了与java.security.MessageDigest;类似的用法,这对我来说也是一个益智游戏。如果有人能够解释其背后的原因,如果可能的话,可以使用一些有用的代码。

2 个答案:

答案 0 :(得分:5)

SimpleDateFormat扩展了具有setter方法的DateFormat,因此一个线程可以更改SimpleDateFormat实例的属性,而其他线程可以使用它并假设更早的属性,或者更糟糕的是,在执行过程中更改属性会导致内部不一致的结果

答案 1 :(得分:4)

好吧,走format(Date, StringBuffer, FieldDelegate)中的第一行:

calendar.setTime(date);

calendar有一个实例成员,因此在那里显然不是线程安全的。首先是日期竞赛(因为setTime未同步),但更为明显的是,有人可以通过该函数将日历的时间设置为其他部分({{ 1 {}}的值在calendar中访问,subFormat调用。