Kotlin中SynchronizedLazyImpl引发Long monitor contention,如何追踪根源?
问题排查:Kotlin Lazy委托引发的长监视器竞争警告
问题描述
收到警告:Long monitor contention at java.lang.Object kotlin.SynchronizedLazyImpl.getValue()(LazyJVM.kt:69) waiters=5。排查后定位到Kotlin标准库LazyJVM.kt:69,推测是lazy委托导致问题。移除自身代码中所有lazy委托的使用后,仍收到该警告,想知道如何追踪具体调用原因,以及是否存在遗漏点。
问题定位结果
通过堆栈追踪发现遗漏了一处用lazy初始化的单例对象,该对象被多个函数几乎同时调用。由于Kotlin的lazy委托默认是线程安全的,仅会执行一次初始化逻辑,其他同时发起的调用会被阻塞,直到初始化完成,因此引发了监视器竞争警告。
复现方法
- 创建一个初始化耗时的lazy单例对象,可通过添加人工延迟模拟:
val expensiveSingleton by lazy { Thread.sleep(1000) // 模拟耗时初始化 ExpensiveObject() } - 在多个不同的函数中,几乎同时调用这个单例对象
内容的提问来源于stack exchange,提问作者Cyber Avater
相关产品推荐
相关产品推荐

