Почему ленивая переменная инициализируется несколько раз для каждого потока

#kotlin #ktor

#kotlin #ktor

Вопрос:

Я работаю над некоторым кодом, в котором я создаю HikariDataSource как по отложенному значению. Я применил режим LazyThreadSafetyMode.СИНХРОНИЗИРОВАНО, поэтому я не понимаю, почему инициализация выполняется дважды, когда я запускаю новый поток, который считывает это значение

 // in module database
val dataSource: HikariDataSource by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
    HikariDataSource(dataSourceConfig(databaseConfig))
}

fun initDatabase() {
  dataSource.connect().let { //do stuff}
}

// in main module
fun main() {
  initDatabase()
  thread {
    dataSource.connect().let { // initializes a new data source... }
  }
}
 

Я бы ожидал, что HikariDataSource будет инициализирован один раз, но по какой-то причине он вызывается дважды…
Я думаю, что тот факт, что я предоставляю эту переменную другому проекту gradle, может повлиять на это, но не уверен, почему..

Ответ №1:

Ну, я думаю, я только что ответил на свой вопрос…

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

Я предполагаю, что ktor что-то делает с загрузчиком классов для горячей перезагрузки, из-за чего это происходит.

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

1. Это спасает жизнь. Такая неприятная проблема.