问题与 Java 的 SimpleDateFormat 类有关。我在文档中读到
日期格式不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问一个格式,它必须在外部同步。
显然,我在被它以最模糊的方式击中后读过它。
有谁知道为什么需要通过“格式”方法访问类成员中的状态信息?
它是某种速度优化吗?我想不出一个正当的理由。
问题与 Java 的 SimpleDateFormat 类有关。我在文档中读到
日期格式不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问一个格式,它必须在外部同步。
显然,我在被它以最模糊的方式击中后读过它。
有谁知道为什么需要通过“格式”方法访问类成员中的状态信息?
它是某种速度优化吗?我想不出一个正当的理由。
你的答案几乎就在这里:
/* * (C) 版权所有 Taligent, Inc. 1996 - 保留所有权利
在 1.4 热点之前,用 Java 编写多线程代码主要是研究生的家庭作业。在 Web 应用程序服务器的真正到来和容器驱动的高并发系统兴起之前,该语言已经出现了大约 10 年,而我们大多数人(无论如何都不是安卓)花费了我们绝大多数时间在其中工作。
在 1996 年,垃圾收集是一个非常缓慢和痛苦的过程,通常会让你的 UI 暂停并在它发生时看起来被锁定,就像明智地创建新对象被认为是非常昂贵的(当你与 Windows 95 战斗时创建连续的内存空间在没有 L2 CPU 缓存的情况下共享 4MB 物理内存需要一些时间......)。
因此,在多线程极为罕见且内存非常宝贵的环境中(您的普通用户可能仍在使用 486 或 Pentium 1,系统内存为 8MB 甚至 4MB ......) - 尽可能使用单个日历实例,日历本身就是一个笨重的野兽。
今天,我们可以嘲笑这样一个有状态的类是多么可怕的做法,但在当时它也可以很容易地被辩护为正确的选择。
捍卫 Sun 对 100% 向后兼容性的痴迷并且从不更新它是理所当然的事情!
看起来它是出于性能原因而完成的。我看不出有其他解释。
这里有一个很好的总结: 为什么 Java 的 SimpleDateFormat 不是线程安全的?