Kotlin 为什么每个线程都要多次初始化惰性变量
我正在编写一些代码,其中我创建了一个HikariDataSource作为一个ByLazy值。我确实应用了LazyThreadSafetyMode.SYNCHRONIZED模式,所以我不明白为什么在启动读取该值的新线程时会进行两次初始化Kotlin 为什么每个线程都要多次初始化惰性变量,kotlin,ktor,Kotlin,Ktor,我正在编写一些代码,其中我创建了一个HikariDataSource作为一个ByLazy值。我确实应用了LazyThreadSafetyMode.SYNCHRONIZED模式,所以我不明白为什么在启动读取该值的新线程时会进行两次初始化 // in module database val dataSource: HikariDataSource by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { HikariDataSource(dataSourceC
// 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正在使用类加载器进行热重新加载,这导致了这种情况的发生