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.