Scala 并发编程中的传统构建块(上)
1. 惰性值(Lazy values)
在 Scala 编程里,惰性值是一种特殊的值声明方式。与常规值不同,惰性值在首次被读取时,才会使用其右侧的表达式进行初始化;而常规值在创建的瞬间就会完成初始化。若程序中从未读取某个惰性值,那么它就不会被初始化,也就无需承担初始化的成本。
惰性值具有诸多优点,它能用于实现像惰性流这样的数据结构,改善持久数据结构的复杂度,提升程序性能,还能避免 Scala 混入组合中初始化顺序的问题。不过,在并发程序中使用惰性值时,可能会出现一些意想不到的情况。
下面来看一个示例:
object LazyValsCreate extends App {
lazy val obj = new AnyRef
lazy val non = s"made by ${Thread.currentThread.getName}"
execute {
log(s"EC sees obj = $obj")
log(s"EC sees non = $non")
}
log(s"Main sees obj = $obj")
log(s"Main sees non = $non")
Thread.sleep(500)
}
在这个例子中, obj 遵循了用不依赖程序当前状态的表达式来初始化惰性值的良好实践,而 non 则没有。运行该程序时, non 惰性值的初始化结果是不确定的,有时会用主线程的
超级会员免费看
订阅专栏 解锁全文
1404

被折叠的 条评论
为什么被折叠?



