ThreadLocal

Basic Example
package sandbox.kotlin.threading

// A simple class with a mutable property
class ThreadSpecificData(var value: Int)

// Using ThreadLocal to hold ThreadSpecificData
val threadLocalData = ThreadLocal.withInitial { ThreadSpecificData(0) }

fun sleep(milils: Long) {
    Thread.sleep(milils)
}


fun main() {
    // Thread 1
    Thread {

        val data = threadLocalData.get()
        data.value = 100
        myPrint("${data.value}")
        sleep(500)
        myPrint("${data.value}")
    }.start()

    // Thread 2
    Thread {
        val data = threadLocalData.get()
        data.value = 200
        myPrint("${data.value}")
        sleep(500)
        myPrint("${data.value}")
    }.start()
}

private fun myPrint(msg: String) {
    val threadInfo = Thread.currentThread().name
    println("$threadInfo: $msg")
}