我一直在寻找ThreadLocal
的使用并登陆这个热门网页When and how should I use a ThreadLocal variable?
接受的最高投票回答说
一种可能的(和常见的)用法是当你有一些非线程安全的对象,但你想避免同步对该对象的访问(我在看你,SimpleDateFormat)。
代码的核心部分是
return new SimpleDateFormat("yyyyMMdd HHmm");
哪个不会改变或受到并发执行的影响,或者它会不会?
你能否强调这可能是一个问题?为什么我们需要一个线程安全对象?
在其他情况下,我遇到了与java.security.MessageDigest;
类似的用法,这对我来说也是一个益智游戏。如果有人能够解释其背后的原因,如果可能的话,可以使用一些有用的代码。
答案 0 :(得分:5)
SimpleDateFormat扩展了具有setter方法的DateFormat,因此一个线程可以更改SimpleDateFormat实例的属性,而其他线程可以使用它并假设更早的属性,或者更糟糕的是,在执行过程中更改属性会导致内部不一致的结果
答案 1 :(得分:4)
好吧,走format(Date, StringBuffer, FieldDelegate)
中的第一行:
calendar.setTime(date);
calendar
有一个实例成员,因此在那里显然不是线程安全的。首先是日期竞赛(因为setTime
未同步),但更为明显的是,有人可以通过该函数将日历的时间设置为其他部分({{ 1 {}}的值在calendar
中访问,subFormat
调用。