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

Почему бы вам не попробовать вложить свои циклы, как это:

for d_id in dog_ids:
    for file in train_file_list:
        if file.startswith(d_id):
            shutil.copy((root + "/Dataset/Images/" + file), (root + "/Dataset/Training/" + dog_ids_breeds[d_id]))

Надеюсь, это работает! :-)

135
задан ydaetskcoR 15 December 2014 в 14:58
поделиться

5 ответов

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

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

197
ответ дан 23 November 2019 в 23:47
поделиться

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

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

4
ответ дан 23 November 2019 в 23:47
поделиться

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

enum Singleton {
    INSTANCE;
}

или для версии до Java 5.0

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

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

11
ответ дан 23 November 2019 в 23:47
поделиться

Да, инициализатор типа

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

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

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

3
ответ дан 23 November 2019 в 23:47
поделиться

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

0
ответ дан 23 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: