TimeZone.setDefault изменяется в JDK6 - PullRequest
       47

TimeZone.setDefault изменяется в JDK6

17 голосов
/ 01 февраля 2010

Я только что заметил, что JDK 6 имеет другой подход к установке TimeZone по умолчанию, чем 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);
 }

Ответы [ 3 ]

13 голосов
/ 01 февраля 2010

Поиск в базе данных ошибок на самом деле был неплохой идеей:)

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

, а также (re docs):

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

Резюме: JDK 1.5 был исключением из правила, с JDK 1.6 все вернулось к "нормальному" состоянию, которое, согласно документации, заключается в том, что изменение часового пояса распространяется на ВМ.

4 голосов
/ 01 февраля 2010

Это, вероятно, было сделано, чтобы исправить ошибку. Я бы искал bugs.sun.com , чтобы найти обоснование для этого. (Подсказки также можно найти в заметках о выпуске .)

1 голос
/ 01 февраля 2010

В документации API для TimeZone.getDefault () говорится, что «источник TimeZone по умолчанию может различаться в зависимости от реализации». Если ваш код опирается на специфическое для реализации поведение стандартных классов API (в этом случае часовой пояс по умолчанию сохраняется на локальном уровне потока), вы должны ожидать, что ваш код завершится ошибкой с более новыми версиями ВМ или с ВМ из разных поставщиков.

...