【问题标题】:Why is lazy variable initialised multiple times per thread为什么每个线程多次初始化惰性变量
【发布时间】:2019-09-08 04:39:04
【问题描述】:

我正在编写一些代码,在其中创建一个 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 项目的事实可能会影响它,但不知道为什么..

【问题讨论】:

    标签: kotlin ktor


    【解决方案1】:

    好吧,我想我只是回答了我自己的问题......

    访问 dataSource 对象的主要模块是一个配置为热重载的 ktor 服务器。 当我禁用 hotreload 并再次尝试时,变量没有初始化两次。

    我猜 ktor 正在使用类加载器做一些事情来进行热重载,这会导致这种情况发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 2020-03-12
      • 1970-01-01
      • 2019-08-07
      相关资源
      最近更新 更多