为什么Java的SimpleDateFormat类非线程安全?

时间:2012-09-27 18:09:10

标签: java api date concurrency thread-safety

关于Java的SimpleDateFormat类的问题。我在文档中读到了

  

日期格式未同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问格式,则必须在外部进行同步。

显然,在以最晦涩的方式被击中后,我已经读过

有人知道为什么有必要在“格式”方法访问的类成员中拥有状态信息吗?

它是某种速度优化吗?我无法提出正确的理由。

2 个答案:

答案 0 :(得分:8)

你的回答几乎就在这里:

  

/ * *(C)版权所有Taligent,Inc。1996 - 保留所有权利

在1.4热点编写之前,Java中的多线程代码主要是研究生的家庭作业。在Web应用程序服务器的严重到来以及容器驱动的高度并发系统的兴起之前,这种语言已经存在了大约10年,而我们大多数人(非机器人无论如何)都花费了我们绝大部分的时间。

1996年,垃圾收集是一个非常缓慢而痛苦的过程,通常会让你的UI暂停并在发生时看起来被锁定,就像明智地创建新对象被认为是非常昂贵的(当你与Windows战斗时创建连续的内存空间95分享4MB物理内存,没有L2 CPU缓存需要一些时间.....)。

因此,在多线程非常罕见且内存非常宝贵的环境中(普通用户可能仍然使用486或Pentium 1,8MB甚至4MB的系统内存......)感觉尽可能多地重复使用单个日历实例,日历本身就是一个笨拙的野兽。

我们今天可以嘲笑这样一个类似于有状态的可怕实践,但它也很容易被捍卫为当时正确的选择。

捍卫Sun对100%向后兼容性的痴迷,永不更新它是另一回事!

答案 1 :(得分:1)

看起来它是出于性能原因而完成的。我没有看到其他解释。

这里有一个很好的总结: Why is Java's SimpleDateFormat not thread-safe?