Для решения этого конкретного вопроса Параллелизм Java на практике (написанный командой, которая в основном написала библиотеку java.util.concurrent) рекомендует Идиома класса владельца отложенной инициализации (стр. 348) в моем экземпляре, листинг 16.6, а не 16.7)
@ThreadSafe
public class DBAccessServiceFactory {
private static class ResourceHolder {
public static DBAccessService INSTANCE = new DBAccessService();
}
public static DBAccessService getResource() {
return ResourceHolder.INSTANCE;
}
}
Это всегда законно и потокобезопасно. Я не эксперт, поэтому не могу сказать, что это лучше, чем ваш код. Однако, учитывая, что это шаблон, рекомендованный Дагом Ли и Джошуа Блохом, я всегда буду использовать его над кодом, который вы или я изобрели, так как на нем очень легко ошибаться (о чем свидетельствует количество неправильных ответов на этот вопрос). ).
В связи с нестабильной проблемой они говорят:
Последующие изменения в JMM (Java 5.0 и более поздние версии) позволили DCL работать, если ресурс стал нестабильным ... Однако идиома ленивого держателя инициализации предлагает те же преимущества и проще для понимания.