Fork me on GitHub

DynamicVariable详解

内容来源于:https://stackoverflow.com/questions/5116352/when-we-should-use-scala-util-dynamicvariable

说明

1
2
protected val _response   = new DynamicVariable[HttpServletResponse](null)
protected val _request = new DynamicVariable[HttpServletRequest](null)

DynamicVariable是贷款和动态范围模式的实现。 DynamicVariable的使用情况与Java中的ThreadLocal非常相似(事实上,DynamicVariable在后台使用InheritableThreadLocal) – 当需要在一个封闭的作用域内进行计算时,每个线程都有自己的副本的变量值:

1
2
3
dynamicVariable.withValue(value){ valueInContext =>
// value used in the context
}

由于DynamicVariable使用可继承的ThreadLocal,变量的值被传递给上下文中生成的线程:

1
2
3
4
5
dynamicVariable.withValue(value){ valueInContext =>
spawn{
// value is passed to the spawned thread
}
}

DynamicVariable(和ThreadLocal)在Scalatra中使用的原因与在许多其他框架(Lift,Spring,Struts等)中使用的相同 – 它是一种非侵入性的方式来存储和传递上下文(线程)特定的信息。

使HttpServletResponse和HttpServletRequest动态变量(并因此,绑定到处理请求的特定线程)只是最简单的方法来获取它们在代码中的任何地方(不通过方法参数或任何其他显式)。

案例

1
2
3
4
5
6
7
val dyn = new DynamicVariable[String]("withoutValue")
def print=println(dyn.value)
print
dyn.withValue("withValue") {
print
}
print

结果
withoutValue
withValue
withoutValue

本文标题:DynamicVariable详解

文章作者:tang

发布时间:2019年02月13日 - 23:02

最后更新:2019年04月10日 - 18:04

原始链接:https://tgluon.github.io/2019/02/13/DynamicVariable详解/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------