我正在编写一些代码,在其中创建 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 项目可能会影响它,但不确定为什么..
最佳答案
嗯,我想我只是回答了我自己的问题......
访问 dataSource 对象的主模块是一个配置为热重载的 ktor 服务器。 一旦我禁用热重载并再次尝试,该变量就没有初始化两次。
我猜 ktor 正在使用类加载器进行一些操作以进行热重载,从而导致这种情况发生。
关于kotlin - 为什么每个线程都会多次初始化惰性变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55735909/