未来内部的DynamicVariable

时间:2018-06-22 10:58:37

标签: scala concurrency thread-local-storage

下面有一个示例代码,该代码是对很少会引起问题的代码的抽象。 问题意味着即使构筑了新的未来currentSession.value.isDefined也是正确的。

object databaseImpl {

  private val currentSession = new DynamicVariable[Option[String]](None)

  def withSessionExecute[T](f: String => T): T = {
    val session = "dummy"
    checkNoSessionInThread()
    currentSession.withValue(Option(session)) {
      f(session)
    }
  }

  private def checkNoSessionInThread(): Unit = {
    if (currentSession.value.isDefined) {
      throw new IllegalStateException("Currentsession has already a value :(")   
    }
  }
}

示例用法

Future {databaseImpl.withSessionExecute( session => session)}

什么会导致在Future内部使用的类中的DynamicVariable在其在Future内部设置之前具有值? 将来执行时可以切换线程吗?

1 个答案:

答案 0 :(得分:1)

Scala中的

$rom实现使用线程局部空间。如果您阅读有关线程局部值的文档,则会看到DynamicVariable与当前线程相关联。当线程产生另一个线程时,无论绑定了什么值,线程本地空间都会复制到新线程中。由于这个原因以及其他几个原因,DynamicVariable几乎永远不是一个很好的解决方案。

DynamicVariable取决于它们在其中运行的执行上下文。一些执行上下文很可能能够在线程之间移动任务。阅读documentation,了解Scala中的执行环境和未来。