gpt4 book ai didi

java - 在 SimpleDateFormat 上同步与克隆

转载 作者:太空狗 更新时间:2023-10-29 22:53:06 25 4
gpt4 key购买 nike

我们知道dateformat 类不是线程安全的。我有一个需要使用日期格式的多线程场景。我不能真正在新线程中创建一个新实例,因为 SimpledateFormat 创建似乎很昂贵(构造函数最终调用“编译”,这是昂贵的)。经过一些测试后,我只剩下两个选择:

  1. 外部同步 - 我真的不想这样做
  2. 在每个线程中克隆 - 不知道是否有问题?

有什么建议吗?

如果大家以前遇到过这种情况,您的方向是什么。

注意:一个similar question之前被问过,但它被关闭指向一个 apache 包。我不能为此使用新的库。我也读过类似的 question on SO

最佳答案

如果您创建了一个类,该类将以循环方式使用预先创建的 SimpleDateFormat 对象的固定大小池来格式化日期,会怎样?鉴于无争议同步的成本很低,这可以在 SimpleDateFormat 对象上同步,从而分摊整个集合中的冲突。

因此可能有 50 个格式化程序,每个格式化程序轮流使用 - 只有当 51 个日期实际上同时被格式化时才会发生冲突,从而发生锁争用。

编辑 2011-02-19(太平洋标准时间)

我按照上面的建议实现了一个固定池,其代码(包括测试)是 available on my website .

以下是在 Java 6 SE 客户端 JVM 中运行的四核 AMD Phenom II 965 BE 上的结果:

2011-02-19 15:28:13.039 : Threads=10, Iterations=1,000,000
2011-02-19 15:28:13.039 : Test 1:
2011-02-19 15:28:25.450 : Sync : 12,411 ms
2011-02-19 15:28:37.380 : Create : 10,862 ms
2011-02-19 15:28:42.673 : Clone : 4,221 ms
2011-02-19 15:28:47.842 : Pool : 4,097 ms
2011-02-19 15:28:48.915 : Test 2:
2011-02-19 15:29:00.099 : Sync : 11,184 ms
2011-02-19 15:29:11.685 : Create : 10,536 ms
2011-02-19 15:29:16.930 : Clone : 4,184 ms
2011-02-19 15:29:21.970 : Pool : 3,969 ms
2011-02-19 15:29:23.038 : Test 3:
2011-02-19 15:29:33.915 : Sync : 10,877 ms
2011-02-19 15:29:45.180 : Create : 10,195 ms
2011-02-19 15:29:50.320 : Clone : 4,067 ms
2011-02-19 15:29:55.403 : Pool : 4,013 ms

值得注意的是,克隆和汇集非常接近。在重复运行中,克隆比池化速度快,速度慢。当然,该测试是为极端竞争而特意设计的。

在 SimpleDateFormat 的特定情况下,我想我可能很想创建一个模板并按需克隆它。在更一般的情况下,我可能会想将此池用于此类事情。

在以某种方式做出最终决定之前,我想对各种 JVM、版本以及各种此类对象进行彻底测试。较旧的 JVM,以及手持设备和电话等小型设备上的 JVM,在对象创建和垃圾收集方面可能会有更多的开销。相反,它们可能在无争议的同步中有更多的开销。

FWIW,从我对代码的审查来看,SimpleDateFormat 似乎最有可能在克隆过程中做最多的工作。

编辑 2011-02-19(太平洋标准时间)

同样有趣的是无竞争的单线程结果。在这种情况下,池的性能与单个同步对象相当。这意味着池是整体上最好的选择,因为它在满足和无竞争时提供出色的性能。有点令人惊讶的是,单线程时克隆效果不佳。

2011-02-20 13:26:58.169 : Threads=1, Iterations=10,000,000
2011-02-20 13:26:58.169 : Test 1:
2011-02-20 13:27:07.193 : Sync : 9,024 ms
2011-02-20 13:27:40.320 : Create : 32,060 ms
2011-02-20 13:27:53.777 : Clone : 12,388 ms
2011-02-20 13:28:02.286 : Pool : 7,440 ms
2011-02-20 13:28:03.354 : Test 2:
2011-02-20 13:28:10.777 : Sync : 7,423 ms
2011-02-20 13:28:43.774 : Create : 31,931 ms
2011-02-20 13:28:57.244 : Clone : 12,400 ms
2011-02-20 13:29:05.734 : Pool : 7,417 ms
2011-02-20 13:29:06.802 : Test 3:
2011-02-20 13:29:14.233 : Sync : 7,431 ms
2011-02-20 13:29:47.117 : Create : 31,816 ms
2011-02-20 13:30:00.567 : Clone : 12,382 ms
2011-02-20 13:30:09.079 : Pool : 7,444 ms

关于java - 在 SimpleDateFormat 上同步与克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5038169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com