时区.setJDK6 中的默认设置更改

2022-09-03 02:03:59

我刚刚注意到JDK 6与JDK5具有不同的设置默认时区的方法。

以前,新的默认值将存储在线程局部变量中。在 JDK6(我刚刚查看了 1.6.0.18)中,实现已更改,因此,如果用户可以写入“user.timezone”属性,或者没有安装 SecurityManager,则时区会在 VM 范围内更改!否则,将发生线程局部更改。

我错了吗?这似乎是一个非常剧烈的变化,我在网上找不到任何关于它的东西。

下面是 JDK6 代码:

 private static boolean hasPermission() {
  boolean hasPermission = true;
  SecurityManager sm = System.getSecurityManager();
  if (sm != null) {
   try {
    sm.checkPermission(new PropertyPermission("user.timezone", "write"));
   } catch (SecurityException e) {
    hasPermission = false;
   }
  }
  return hasPermission;
 }

 /**
  * Sets the <code>TimeZone</code> that is
  * returned by the <code>getDefault</code> method.  If <code>zone</code>
  * is null, reset the default to the value it had originally when the
  * VM first started.
  * @param zone the new default time zone
  * @see #getDefault
  */
 public static void setDefault(TimeZone zone)
 {
  if (hasPermission()) {
   synchronized (TimeZone.class) {
    defaultTimeZone = zone;
    defaultZoneTL.set(null);
   }
  } else {
   defaultZoneTL.set(zone);
  }
 }

而之前(在JDK5中),它只是:

 /**
  * Sets the <code>TimeZone</code> that is
  * returned by the <code>getDefault</code> method.  If <code>zone</code>
  * is null, reset the default to the value it had originally when the
  * VM first started.
  * @param zone the new default time zone
  * @see #getDefault
  */
 public static synchronized void setDefault(TimeZone zone)
 {
  defaultZoneTL.set(zone);
 }

答案 1

搜索错误数据库实际上是一个好主意:)

http://bugs.sun.com/view_bug.do?bug_id=6352812

以及(重新文档):

http://bugs.sun.com/view_bug.do?bug_id=6181786

简介: JDK 1.5是规则的例外,JDK 1.6的情况又回到了“正常”,根据文档,这是时区更改是VM范围的。


答案 2

这样做可能是为了修复错误。我会搜索 bugs.sun.com 以找到它的理由。(在发行说明中也可以找到线索。


推荐