kotlin - 为什么每个线程都会多次初始化惰性变量

标签 kotlin ktor

我正在编写一些代码,在其中创建 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/

相关文章:

android - 没有 onCreateView 的 Fragment

lambda - Kotlin lambda 中的 vararg 参数

kotlin - 无法在 Quarkus kotlin 应用程序中注入(inject) REST 客户端接口(interface)

kotlin - 我们可以用 kotlin 构建一个全栈 webapp 吗?

kotlin - 在 Ktor 中重定向到绝对 URL

kotlin - Ktor路由: How to factorize the routing functionality in an application/api?

android - 如何在 Jetpack Compose 中正确使用 StateFlow?

android - 由于 ModelClass 在 KotlinMultiplatform 应用程序中不是可序列化或可解析的,导致 nav_graph 参数错误

json - ktor 为某些数据类抛出 NoTransformationFoundException

kotlin - Ktor 与 Koin DI 无法注入(inject),缺少 clazz