Почему бы вам не попробовать вложить свои циклы, как это:
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]))
Надеюсь, это работает! :-)
Да, статические инициализаторы Java являются потокобезопасными (используйте первый вариант).
Однако, если вы хотите, чтобы код выполнялся ровно один раз, вам нужно убедиться, что класс загружается только одним загрузчиком классов. Статическая инициализация выполняется один раз для каждого загрузчика классов.
В обычных обстоятельствах все в статическом инициализаторе происходит до всего, что использует этот класс, поэтому синхронизация обычно не требуется. Однако этот класс доступен для всего, что вызывает статический инициализатор (включая вызов других статических инициализаторов).
Класс может быть загружен загруженным классом, но не обязательно сразу инициализироваться. Конечно, класс может быть загружен несколькими экземплярами загрузчиков классов и, таким образом, стать несколькими классами с одним и тем же именем.
Этот трюк можно использовать для отложенной инициализации
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 ()
Да, инициализатор типа
A static
вызывается только один раз, поэтому по этому определению он потокобезопасен - вам понадобятся два или более вызова статический
инициализатор, чтобы даже получить конкуренцию потоков.
Тем не менее, статические
инициализаторы сбивают с толку во многих других отношениях. На самом деле нет определенного порядка, в котором они вызываются. Это действительно сбивает с толку, если у вас есть два класса, инициализаторы которых static
зависят друг от друга. И если вы используете класс, но не используете то, что установит инициализатор static
, вам не гарантируется, что загрузчик классов вызовет статический инициализатор.
Наконец, помните об объектах, которые вы используете синхронизируем по. Я понимаю, что ты спрашиваешь не об этом,
Да, статические инициализаторы запускаются только один раз. Прочтите это для получения дополнительной информации .