java TimeZone getDefault很慢?

时间:2014-01-08 07:44:31

标签: java timezone

我经常使用TimeZone.getDefault调用,而且我有来自客户的缓慢报告。使用jstack检查线程堆栈跟踪,我看到在此方法上阻塞了许多线程:

"LoadBalancerClientSubscriber(7)" prio=10 tid=0x00000000010c2000 nid=0x4055 runnable     [0x00002aaaebc79000]
   java.lang.Thread.State: RUNNABLE
    at java.util.TimeZone.getDefaultInAppContext(TimeZone.java:734)
    - locked <0x0000000512916db0> (a java.lang.Class for java.util.TimeZone)
    at java.util.TimeZone.getDefaultRef(TimeZone.java:630)
    at java.util.TimeZone.getDefault(TimeZone.java:622)
"RequestServiceThreadPool(5)" prio=10 tid=0x00002aaae01b2800 nid=0x4022 waiting for     monitor entry [0x00002aaae8a47000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.util.TimeZone.getDefaultInAppContext(TimeZone.java:734)
    - waiting to lock <0x0000000512916db0> (a java.lang.Class for java.util.TimeZone)
    at java.util.TimeZone.getDefaultRef(TimeZone.java:630)
    at java.util.TimeZone.getDefault(TimeZone.java:622)

这是一种已知行为吗?我应该缓存这个TimeZone对象吗?如果我的应用程序运行了好几个月(即使在DST更改期间),是否可以安全地缓存它?

谢谢!

1 个答案:

答案 0 :(得分:1)

是的,这是一个已知问题:http://coffeedriven.org/2012/10/14/be-carefull-with-calendar-getinstance-and-timezone-gettimezone/

简单的解决方法是调用方法一次并缓存结果。