Kotlin 为什么每个线程都要多次初始化惰性变量

Kotlin 为什么每个线程都要多次初始化惰性变量,kotlin,ktor,Kotlin,Ktor,我正在编写一些代码,其中我创建了一个HikariDataSource作为一个ByLazy值。我确实应用了LazyThreadSafetyMode.SYNCHRONIZED模式,所以我不明白为什么在启动读取该值的新线程时会进行两次初始化 // in module database val dataSource: HikariDataSource by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { HikariDataSource(dataSourceC

我正在编写一些代码,其中我创建了一个HikariDataSource作为一个ByLazy值。我确实应用了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项目可能会影响它,但不确定为什么….

嗯,我想我刚刚回答了我自己的问题

访问数据源对象的主模块是配置为热重新加载的ktor服务器。。 当我禁用hotload并重试时,变量没有初始化两次

我猜ktor正在使用类加载器进行热重新加载,这导致了这种情况的发生