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")
}