【发布时间】:2014-06-05 23:46:59
【问题描述】:
试图将memoization 引入递归算法。
case class Memo[A,B](f: A => B) extends (A => B) {
private val cache = mutable.Map.empty[A, B]
def apply(x: A) = cache getOrElseUpdate (x, f(x))
}
private val fib: Memo[Int, BigInt] = Memo {
case 0 => 0
case 1 => 1
case n => fib(n-1) + fib(n-2)
}
def foo(n: Int) = {
fib(n)
}
这是否意味着如果我们使用可变状态和函数值(由 val.. 几乎是函数值定义)那么它不是线程安全的?
(val fib - 看起来像全局范围的可变变量/对象)
【问题讨论】:
-
在这里,您可以使用
var来挽救线程安全,该var持有不可变的Map,每次更新都会替换该@volatile。或者,您可以使用(有点)线程安全、可变的Map类型TrieMap。请参阅 stackoverflow.com/questions/21286823/… 了解重要警告。 -
实际上给定的多线程在构建 memoization 时并没有多大帮助:stackoverflow.com/a/20462893/2073130,仅在单线程中对 DP 使用 memoization。这样一来,普通的
mutable.Map就足够了。
标签: scala thread-safety dynamic-programming memoization