Kotlin delegar propiedad por perezoso que es hilo local

¿Hay una manera simple de get una propiedad delegada by lazy el valor de by lazy calculado por hilo como ThreadLocal ?

LazyThreadSafetyMode controla la initialization concurrente, con .NONE acercándose a la funcionalidad deseada al permitir que varios subprocesss reciban valores diferentes, pero tiene posteriores llamadas de initialization que hacen reference al mismo object, devolviendo el mismo valor singular independientemente del subprocess, con algunos casos devolviendo null .

Independientemente de la initialization simultánea o de la initialization tardía, la propiedad almacenaría en caching un valor único por subprocess.

Los delegates de Kotlin son fáciles de ampliar con su propia implementación.

  • Puede hacer que su delegado mantenga un ThreadLocal<T> con initialValue calculado por la function que se pasa:

     class ThreadLocalLazy<T>(val provider: () -> T) :ReadOnlyProperty<Any?, T> { private val threadLocal = object : ThreadLocal<T>() { override fun initialValue(): T = provider() } override fun getValue(thisRef: Any?, property: KProperty<*>): T = threadLocal.get() } 
  • O mantenga un Lazy<T> por hilo con ThreadLocal<Lazy<T>> , para que su delegado pueda implementar Lazy<T> por sí mismo:

     class ThreadLocalLazy<T>(val provider: () -> T) : Lazy<T> { private val threadLocal = object : ThreadLocal<Lazy<T>>() { override fun initialValue(): Lazy<T> = lazy(LazyThreadSafetyMode.NONE, provider) } override val value get() = threadLocal.get().value override fun isInitialized() = threadLocal.get().isInitialized() } 

Aquí hay una function de conveniencia para crear instancias del delegado:

 fun <T> threadLocalLazy(provider: () -> T) = ThreadLocalLazy(provider) 

Entonces simplemente delegue una propiedad a threadLocalLazy { ... } . Ejemplo de uso:

 class Example { val threadId by threadLocalLazy { Thread.currentThread().id } } fun main(args: Array<String>) { val example = Example() repeat(3) { thread { println(example.threadId) // should print three different numbers } } }