Почему ленивая переменная инициализируется несколько раз на поток - PullRequest
1 голос
/ 18 апреля 2019

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

// 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 Ответ

1 голос
/ 18 апреля 2019

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

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

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

...