Потоковая безопасность статических блоков в Java - PullRequest
39 голосов
/ 20 января 2009

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

Ответы [ 3 ]

46 голосов
/ 20 января 2009

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

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

15 голосов
/ 20 января 2009

Инициализация статического класса гарантируется поточно-ориентированной Java.

2 голосов
/ 21 января 2009

обратите внимание, что вы не вызываете код, который требует блокировки для инициализируемого класса - он будет тупиковым. см. этот пост в блоге: http://ramblingabout.wordpress.com/2008/04/10/deadlock-quiz-the-answer/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...