美文网首页
Kotlin lazy 实现原理

Kotlin lazy 实现原理

作者: markRao | 来源:发表于2021-05-10 11:33 被阅读0次
/**
 * Creates a new instance of the [Lazy] that uses the specified initialization function [initializer]
 * and the default thread-safety mode [LazyThreadSafetyMode.SYNCHRONIZED].
 *
 * If the initialization of a value throws an exception, it will attempt to reinitialize the value at next access.
 *
 * Note that the returned instance uses itself to synchronize on. Do not synchronize from external code on
 * the returned instance as it may cause accidental deadlock. Also this behavior can be changed in the future.
 */
public actual fun <T> lazy(initializer: () -> T): Lazy<T> = SynchronizedLazyImpl(initializer)

上面的函数体为 lazy 的实现代码,该函数的参数为接收一个无参并返回值为 T 类型的函数,然后它的实现是 SynchronizedLazyImpl

private class SynchronizedLazyImpl<out T>(initializer: () -> T, lock: Any? = null) : Lazy<T>, Serializable {
    private var initializer: (() -> T)? = initializer
    // 用内存可见性来检查是否在其他线程初始化过,这样来保证多线程安全
    @Volatile private var _value: Any? = UNINITIALIZED_VALUE
    // final field is required to enable safe publication of constructed instance
    private val lock = lock ?: this
    // 重写 get 来保证懒加载,只在使用的时候才执行函数
    override val value: T
        get() {
            val _v1 = _value
            // 如果不为默认值则说明被其他线程或该线程已经初始化过,这也就是 lazy 只执行一次后续直接取值的原因
            if (_v1 !== UNINITIALIZED_VALUE) {
                @Suppress("UNCHECKED_CAST")
                // 转为 T 类型返回
                return _v1 as T
            }

            return synchronized(lock) {
                val _v2 = _value
                if (_v2 !== UNINITIALIZED_VALUE) {
                    @Suppress("UNCHECKED_CAST") (_v2 as T)
                } else {
                    // lazy 返回值为该函数的执行结果
                    val typedValue = initializer!!()
                    _value = typedValue
                    initializer = null
                    typedValue
                }
            }
        }
    // 判断是否初始化过
    override fun isInitialized(): Boolean = _value !== UNINITIALIZED_VALUE

    override fun toString(): String = if (isInitialized()) value.toString() else "Lazy value not initialized yet."

    private fun writeReplace(): Any = InitializedLazyImpl(value)
}

相关文章

  • Kotlin lazy 实现原理

    上面的函数体为 lazy 的实现代码,该函数的参数为接收一个无参并返回值为 T 类型的函数,然后它的实现是 Syn...

  • Kotlin的by 委托

    Kotlin的by 委托 1. by lazy的原理解析 我们用kotlin经常会用到by lazy,所以我之前一...

  • kotlin-by lazy实现原理

    一、lazy的定义 lazy是一个定义在LazyJVM中的函数,有两种实现。这里看其中一种: lazy其实就是使用...

  • Kotlin lateinit 和 by lazy实现原理

    lateinit lateinit:用来修饰var类型成员变量,用来表示该变量可以在晚些时候初始化,用来避免不必要...

  • Kotlin - lateinit vs lazy

    (翻译) 学习Kotlin——lateinit vs lazy lateinit vs lazy 在Kotlin中...

  • kotlin—lazy及其原理

    1、lazy简介 lazy是属性委托的一种,是有kotlin标准库实现。它是属性懒加载的一种实现方式,在对属性使用...

  • 【kotlin】委托

    在 kotlin 开发中,会遇到懒加载的情形:使用 by lazy 关键字。而这是通过委托来实现的。Kotlin ...

  • 面试官:能说一说 Kotlin 中 lateinit 和 laz

    使用 Kotlin 进行开发,对于 latelinit 和 lazy 肯定不陌生。但其原理上的区别,可能鲜少了解过...

  • 能说一说 Kotlin 中 lateinit 和 lazy 的区

    使用 Kotlin 进行开发,对于 latelinit 和 lazy 肯定不陌生。但其原理上的区别,可能鲜少了解过...

  • Kotlin学习笔记

    lateinit 和 by lazy的区别: 是kotlin里面的延迟初始化实现,1.lateinit 只用于变量...

网友评论

      本文标题:Kotlin lazy 实现原理

      本文链接:https://www.haomeiwen.com/subject/yzzbdltx.html