Concurrency and Source Panels
Thread Local Context
Give each worker thread its own context value.
Thread Local Context
ThreadLocalContext.scala
object Main {
val context = new ThreadLocal[String]()
var firstValue = ""
var secondValue = ""
def readAction(name: String, suffix: String, number: Int): Unit = {
context.set(name + "-" + suffix)
firstValue = context.get() + ":" + number
}
def writeAction(name: String, suffix: String, number: Int): Unit = {
context.set(name + "-" + suffix)
secondValue = context.get() + ":" + number
}
def main(args: Array[String]): Unit = {
val suffix =
val reader = Thread(() => readAction("read", suffix, 8))
val writer = Thread(() => writeAction("write", suffix, 9))
reader.start()
writer.start()
reader.join()
writer.join()
println(firstValue)
println(secondValue)
}
}
object Main {
val context = new ThreadLocal[String]()
var firstValue = ""
var secondValue = ""
def readAction(name: String, suffix: String, number: Int): Unit = {
context.set(name + "-" + suffix)
firstValue = context.get() + ":" + number
}
def writeAction(name: String, suffix: String, number: Int): Unit = {
context.set(name + "-" + suffix)
secondValue = context.get() + ":" + number
}
def main(args: Array[String]): Unit = {
val suffix =
val reader = Thread(() => readAction("read", suffix, 8))
val writer = Thread(() => writeAction("write", suffix, 9))
reader.start()
writer.start()
reader.join()
writer.join()
println(firstValue)
println(secondValue)
}
}
object Main {
val context = new ThreadLocal[String]()
var firstValue = ""
var secondValue = ""
def readAction(name: String, suffix: String, number: Int): Unit = {
context.set(name + "-" + suffix)
firstValue = context.get() + ":" + number
}
def writeAction(name: String, suffix: String, number: Int): Unit = {
context.set(name + "-" + suffix)
secondValue = context.get() + ":" + number
}
def main(args: Array[String]): Unit = {
val suffix =
val reader = Thread(() => readAction("read", suffix, 8))
val writer = Thread(() => writeAction("write", suffix, 9))
reader.start()
writer.start()
reader.join()
writer.join()
println(firstValue)
println(secondValue)
}
}
thread-local
A `ThreadLocal` stores a value separately for each thread, so worker context can be read without sharing a mutable field.