Introduce final field in SynchronizedLazyImpl to enable safe publication.
This commit is contained in:
@@ -54,11 +54,10 @@ public enum class LazyThreadSafetyMode {
|
||||
|
||||
private object UNINITIALIZED_VALUE
|
||||
|
||||
internal open class LazyImpl<out T>(initializer: () -> T) : Lazy<T>(), Serializable {
|
||||
internal class SynchronizedLazyImpl<out T>(initializer: () -> T, lock: Any? = null) : Lazy<T>(), Serializable {
|
||||
private var initializer: (() -> T)? = initializer
|
||||
@Volatile private var _value: Any? = UNINITIALIZED_VALUE
|
||||
protected open val lock: Any
|
||||
get() = this
|
||||
private val lock = lock ?: this
|
||||
|
||||
override val value: T
|
||||
get() {
|
||||
@@ -88,8 +87,6 @@ internal open class LazyImpl<out T>(initializer: () -> T) : Lazy<T>(), Serializa
|
||||
private fun writeReplace(): Any = InitializedLazyImpl(value)
|
||||
}
|
||||
|
||||
internal class ExternallySynchronizedLazyImpl<out T>(override val lock: Any, initializer: () -> T): LazyImpl<T>(initializer)
|
||||
|
||||
internal class UnsafeLazyImpl<out T>(initializer: () -> T) : Lazy<T>(), Serializable {
|
||||
private var initializer: (() -> T)? = initializer
|
||||
private var _value: Any? = UNINITIALIZED_VALUE
|
||||
|
||||
@@ -13,7 +13,7 @@ package kotlin
|
||||
* 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 fun lazy<T>(initializer: () -> T): Lazy<T> = LazyImpl(initializer)
|
||||
public fun lazy<T>(initializer: () -> T): Lazy<T> = SynchronizedLazyImpl(initializer)
|
||||
|
||||
/**
|
||||
* Creates a new instance of the [Lazy] that uses the specified initialization function [initializer]
|
||||
@@ -27,7 +27,7 @@ public fun lazy<T>(initializer: () -> T): Lazy<T> = LazyImpl(initializer)
|
||||
*/
|
||||
public fun lazy<T>(mode: LazyThreadSafetyMode, initializer: () -> T): Lazy<T> =
|
||||
when (mode) {
|
||||
LazyThreadSafetyMode.SYNCHRONIZED -> LazyImpl(initializer)
|
||||
LazyThreadSafetyMode.SYNCHRONIZED -> SynchronizedLazyImpl(initializer)
|
||||
LazyThreadSafetyMode.NONE -> UnsafeLazyImpl(initializer)
|
||||
}
|
||||
|
||||
@@ -42,8 +42,4 @@ public fun lazy<T>(mode: LazyThreadSafetyMode, initializer: () -> T): Lazy<T> =
|
||||
* in this case 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 fun lazy<T>(lock: Any?, initializer: () -> T): Lazy<T> =
|
||||
if (lock != null)
|
||||
ExternallySynchronizedLazyImpl(lock, initializer)
|
||||
else
|
||||
LazyImpl(initializer)
|
||||
public fun lazy<T>(lock: Any?, initializer: () -> T): Lazy<T> = SynchronizedLazyImpl(initializer, lock)
|
||||
|
||||
Reference in New Issue
Block a user