为啥每个线程多次初始化惰性变量

Posted

技术标签:

【中文标题】为啥每个线程多次初始化惰性变量【英文标题】: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 项目的事实可能会影响它,但不知道为什么..

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于为啥每个线程多次初始化惰性变量的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Swift 中使用惰性 var 初始化时添加框架不显示 UIView

无法在属性初始化程序中使用实例成员,将变量设置为惰性不起作用

ThreadLocal

谜题85:惰性初始化

多次加载的 Swift 惰性变量(计算属性?)

为啥 redux 多次初始化