Являются ли статические инициализаторы Java streamами безопасными?

Я использую статический блок кода для инициализации некоторых controllerов в реестре, который у меня есть. Поэтому мой вопрос: могу ли я гарантировать, что этот статический блок кода будет абсолютно вызван один раз, когда class будет загружен первым? Я понимаю, что не могу гарантировать, когда этот кодовый блок будет вызван, я угадываю его, когда Classloader сначала загружает его. Я понимаю, что могу синхронизировать class в статическом блоке кода, но я предполагаю, что это на самом деле то, что происходит в любом случае?

Простым примером кода будет;

class FooRegistry { static { //this code must only ever be called once addController(new FooControllerImpl()); } private static void addController(IFooController controller) { // ... } } 

или я должен это делать;

 class FooRegistry { static { synchronized(FooRegistry.class) { addController(new FooControllerImpl()); } } private static void addController(IFooController controller) { // ... } } 

    Да, статические инициализаторы Java являются streamобезопасными (используйте свой первый вариант).

    Однако, если вы хотите убедиться, что код выполняется точно, как только вам нужно убедиться, что class загружен только одним загрузчиком classов. Статическая инициализация выполняется один раз для classа-загрузчика.

    Это трюк, который вы можете использовать для ленивой инициализации

     enum Singleton { INSTANCE; } 

    или для pre Java 5.0

     class Singleton { static class SingletonHolder { static final Singleton INSTANCE = new Singleton(); } public static Singleton instance() { return SingletonHolder.INSTANCE; } } 

    Поскольку статический блок в SingletonHolder будет запускаться один раз в streamовом безопасном режиме, вам не нужна никакая другая блокировка. Класс SingletonHolder будет загружен только при вызове instance ()

    В обычных обстоятельствах все в статическом инициализаторе происходит – перед тем, что использует этот class, поэтому синхронизация обычно не требуется. Тем не менее, class доступен для всего, что вызвано статическим intiailiser (в том числе причиной вызова других статических инициализаторов).

    Класс может быть загружен classом, загруженным, но не обязательно инициализированным сразу. Конечно, class может быть загружен экземплярами мультипликаторов classов и, таким образом, становится несколькими classами с тем же именем.

    Да, вроде

    static инициализатор получает только один раз, поэтому по этому определению он streamобезопасен – вам понадобится два или более вызовов static инициализатора, чтобы даже получить конфликт streamов.

    Тем не менее, static инициализаторы сбивают с толку многими другими способами. Там действительно нет определенного порядка, в котором они вызваны. Это становится очень запутанным, если у вас есть два classа, static инициализаторы которых зависят друг от друга. И если вы используете class, но не используете то, что установит static инициализатор, вам не гарантируется, что загрузчик classов вызовет статический инициализатор.

    Наконец, имейте в виду объекты, на которые вы синхронизируете. Я понимаю, что на самом деле это не то, о чем вы просите, но убедитесь, что ваш вопрос не спрашивает, нужно ли делать addController() поточно-безопасным.

    Да, статические инициализаторы запускаются только один раз. Прочтите это для получения дополнительной информации .

    Итак, в основном, поскольку вам нужен экземпляр singleton, вы должны сделать это более или менее старомодным способом и убедиться, что ваш одноэлементный объект инициализирован один раз и только один раз.

    Interesting Posts

    jQuery откладывает и обещает – .then () vs .done ()

    Как сделать пакетный файл завершенным после возникновения ошибки?

    Подождите, пока ActiveWorkbook.RefreshAll закончит – VBA

    Использование: – (двоеточие в столбце) в bash

    Защитник Windows: отключить режим реального времени; Следить за расписанием и по требованию

    mysql проверяет, находятся ли числа в списке, разделенном запятыми

    UIView animateWithDuration не изменяет параметр cornerRadius

    Как получить часть файла после строки, которая соответствует выражению grep? (первое совпадение)

    Лучшая практика для принудительного сбора мусора в C #

    Создать rar без структуры каталогов из командной строки

    Такая же установка Windows, как и хост, так и гость

    Каковы преимущества схем SQL Server?

    Пример кода Resharper для объяснения «Возможное множественное перечисление IEnumerable»

    Как сохранить Firefox файлы txt автоматически, а не открывать в браузере

    Добавить MIME-сопоставление в web.config для IIS Express

    Давайте будем гением компьютера.