Ответ 1
Если первый поток не завершил инициализацию SomeClass, второй поток будет блокироваться.
Это подробно описано в Спецификации языка Java в разделе раздел 12.4.2.
Скажем, у меня есть Java-код:
public class SomeClass {
static {
private final double PI = 3.14;
private final double SOME_CONSTANT = 5.76;
private final double SOME_OTHER_CONSTANT = 756.33;
}
//rest of class
}
Если поток создает экземпляр SomeClass и находится в середине инициализации значений в статическом блоке, когда второй поток создает экземпляр SomeClass, что происходит со статическим блоком? Второй поток игнорирует его, предполагая, что он уже инициализирован, хотя первый поток не выполняется? Или происходит что-то еще?
Если первый поток не завершил инициализацию SomeClass, второй поток будет блокироваться.
Это подробно описано в Спецификации языка Java в разделе раздел 12.4.2.
Инициализация статического класса гарантируется потокобезопасностью Java.
Следите, чтобы вы не вызывали код, требующий блокировки для инициализированного класса - он будет блокирован. см. это сообщение в блоге: http://ramblingabout.wordpress.com/2008/04/10/deadlock-quiz-the-answer/