Изменения в TimeZone.setDefault в JDK6

Я только заметил, что 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);
 }

Ответ 1

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

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 вернулись к "нормальному", что, согласно документам, заключается в том, что изменение часового пояса является широким диапазоном VM.

Ответ 2

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

Ответ 3

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