Как выполнить быструю инициализацию синглтона в отдельном потоке?

#java #multithreading #initialization #guice #eager-loading

#java #многопоточность #инициализация #guice #нетерпеливая загрузка

Вопрос:

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

Комментарии:

1. можете ли вы использовать прокси этих синглетов? вы хотите распараллелить инициализацию этих дорогостоящих синглетов только на этапе подключения?

2. Если у вас есть несколько синглетов, для инициализации которых требуются минуты, похоже, у вас проблема с дизайном. Вы всегда должны иметь возможность написать приложение, чтобы его запуск не занял несколько минут. Возможно, вы могли бы объяснить, почему это занимает так много времени, возможно, есть лучший способ.

Ответ №1:

Ответ №2:

Конечно, просто запустите вспомогательный поток и дайте ему это сделать. Самый простой способ — использовать SingletonHolder и делать все, что вызывает инициализацию во вспомогательном потоке. Другие потоки будут заблокированы, если они попытаются получить к нему доступ до завершения инициализации, так что все работает нормально.

Комментарии:

1. Это ленивая, а не нетерпеливая инициализация.

2. Вы действительно прочитали мой ответ? SingletonHolder означает отложенную инициализацию, доступ к ней немедленно в новом потоке позволяет сделать это как можно скорее. Это все, чего можно достичь, не так ли? — Теперь я вижу, что вы отметили свой вопрос с помощью guice, это меняет ситуацию.

3. Извините, я должен был сделать часть Guice более очевидной в вопросе.