下面有一个示例代码,该代码是对很少会引起问题的代码的抽象。
问题意味着即使构筑了新的未来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内部设置之前具有值? 将来执行时可以切换线程吗?
答案 0 :(得分:1)
$rom
实现使用线程局部空间。如果您阅读有关线程局部值的文档,则会看到DynamicVariable
与当前线程相关联。当线程产生另一个线程时,无论绑定了什么值,线程本地空间都会复制到新线程中。由于这个原因以及其他几个原因,DynamicVariable
几乎永远不是一个很好的解决方案。
DynamicVariable
取决于它们在其中运行的执行上下文。一些执行上下文很可能能够在线程之间移动任务。阅读documentation,了解Scala中的执行环境和未来。