Подтвердить что ты не робот

Безопасность потоков статических блоков в Java

Скажем, у меня есть 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, что происходит со статическим блоком? Второй поток игнорирует его, предполагая, что он уже инициализирован, хотя первый поток не выполняется? Или происходит что-то еще?

4b9b3361

Ответ 1

Если первый поток не завершил инициализацию SomeClass, второй поток будет блокироваться.

Это подробно описано в Спецификации языка Java в разделе раздел 12.4.2.

Ответ 2

Инициализация статического класса гарантируется потокобезопасностью Java.