Coverage Summary for Class: ReentrantLazyKt (dev.suresh)
Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
ReentrantLazyKt |
0%
(0/1)
|
0%
(0/2)
|
0%
(0/4)
|
0%
(0/18)
|
ReentrantLazyKt$WhenMappings |
|
Total |
0%
(0/1)
|
0%
(0/2)
|
0%
(0/4)
|
0%
(0/18)
|
package dev.suresh
import java.util.concurrent.locks.ReentrantLock
import kotlin.LazyThreadSafetyMode.NONE
import kotlin.LazyThreadSafetyMode.SYNCHRONIZED
import kotlin.concurrent.withLock
/**
* Java Virtual thread friendly Kotlin lazy initialization. The implementation is based on
* [Javalin Lazy](https://github.com/javalin/javalin/pull/1974) implementation.
*/
internal class ReentrantLazy<T : Any?>(initializer: () -> T) : Lazy<T> {
private companion object {
private object UNINITIALIZED_VALUE
}
private var initializer: (() -> T)? = initializer
@Volatile private var lock: ReentrantLock? = ReentrantLock()
@Volatile private var _value: Any? = UNINITIALIZED_VALUE
override val value: T
get() {
lock?.withLock {
if (_value === UNINITIALIZED_VALUE) {
this._value = initializer!!.invoke()
this.lock = null
this.initializer = null
}
}
@Suppress("UNCHECKED_CAST")
return _value as T
}
override fun isInitialized() = _value !== UNINITIALIZED_VALUE
}
/** A virtual thread friendly [kotlin.lazy] implementation. */
fun <T : Any?> vtLazy(
threadSafetyMode: LazyThreadSafetyMode = NONE,
initializer: () -> T
): Lazy<T> =
when (threadSafetyMode) {
SYNCHRONIZED -> ReentrantLazy(initializer)
else -> lazy(threadSafetyMode, initializer)
}