Ниже приведен пример кода, который является абстракцией кода, который, как считается, очень редко вызывает проблемы.
Проблема означает, что даже если новое будущее построено, 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)}
Что может привести к тому, что DynamicVariable в классе, используемом внутри Future, будет иметь значение до того, как оно будет установлено внутри Future? Может ли будущее переключать потоки во время выполнения?





Реализации DynamicVariable в Scala используют пространство, локальное для потока. Если вы прочитаете документацию по локальным значениям потока, вы увидите, что DynamicVariable связан с текущим потоком. Когда поток порождает другой поток, локальное пространство потока дублируется в новый поток с любыми связанными значениями. По этой и нескольким другим причинам DynamicVariable почти никогда не бывает хорошим решением.
Future зависят от контекста выполнения, в котором они работают. Некоторые контексты выполнения вполне могут перемещать задачи между потоками. Прочтите документация о контекстах выполнения и фьючерсах в Scala.
Future, в котором есть блок blocking, может быть перепланирован в зависимости от контекста выполнения. Вам необходимо изучить исходный код контекста выполнения, чтобы определить, как он с этим справляется. Я не верю, что контекст выполнения по умолчанию в настоящее время реализует переключение потоков.
Вы написали «перемещать задачи между потоками» - там задачи означают вычисление результатов внутри Future, не так ли?