功能价值,可变状态和线程安全

时间:2014-04-21 20:26:47

标签: scala thread-safety dynamic-programming memoization

From there

尝试将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 - 看起来像全局范围的可变变量/对象)

1 个答案:

答案 0 :(得分:0)

我会说是的,如果有更多线程同时调用foo,可能会出现问题。即使我在想,如果你只是添加到地图并且键的值始终相同,则无法保证它必须正常工作。如果Map的getOrElseUpdate方法的实现无论出于何种原因都是有状态的,那么它就行不通。根据定义,可变Map的合同不是线程安全的。

如果可以,请将同步添加到地图中,您就可以了:

private val cache = new HashMap[A, B] with SynchronizedMap[A, B]