Инициализация класса и метод синхронизированного класса

В моем приложении есть класс, как показано ниже:

public class Client {
    public synchronized static print() {
        System.out.println("hello");
    }

    static {
        doSomething(); // which will take some time to complete
    }
}

Этот класс будет использоваться в многопоточной среде, многие потоки могут одновременно вызывать метод Client.print (). Интересно, есть ли шанс, что поток-1 запускает инициализацию класса, и до завершения инициализации класса поток-2 входит в метод печати и распечатывает строку «привет»?

Я вижу такое поведение в производственной системе (64-разрядная JVM + Windows 2008R2), однако я не могу воспроизвести это поведение с помощью простой программы в любых средах.

В спецификации языка Java, раздел 12.4.1 (http://java.sun.com/docs/books/jls/second_edition/html/execution.doc.html), говорится:

Класс или интерфейс тип T будет инициализирован непосредственно перед первым появлением любого из следующего:

  • T - это класс, и создается экземпляр T.
  • T - это класс, и вызывается статический метод, объявленный T.
  • Назначено статическое поле, объявленное T.
  • Используется статическое поле, объявленное T, и ссылка на поле не является константой времени компиляции (§15.28). Ссылки на константы времени компиляции должны быть разрешены во время компиляции для копии значения константы времени компиляции, поэтому использование такого поля никогда не вызывает инициализацию.

Согласно этому параграфу, инициализация класса будет происходить до вызова статического метода, однако, неясно, должна ли инициализация класса быть завершена перед вызовом статического метода. Согласно моей интуиции, JVM должна требовать завершения инициализации класса перед вводом его статического метода, и некоторые из моих экспериментов подтверждают мое предположение. Однако я наблюдал противоположное поведение в другой среде. Может кто-нибудь пролить свет на это?

Любая помощь приветствуется, спасибо.

7
задан Jigar Joshi 7 January 2011 в 07:45
поделиться