我正在使用该方法来缓存使用http调用的函数的结果。 我的代码看起来像这样,http可能已经很好了。
def myData: Iterable[String] = {
Cache.getOrElse[Iterable[String]](cacheKey, cacheExpiration)(Await.result(myHttpCallFunction(), Duration.apply(500, TimeUnit.MILLISECONDS)))
}
我曾经把它作为
val myData: Iterable[String] = Await.result(myHttpCallFunction(), Duration.apply(500, TimeUnit.MILLISECONDS))
我的代码线程现在安全吗?或者我应该做些别的事。我必须说我对斯卡拉很新,而且我对内心的工作并不十分熟悉。 如果它不是线程安全的:我怎么能这样做?
答案 0 :(得分:4)
根据源代码,无论缓存实现如何,它都是不线程安全。
def getOrElse[A](key: String, expiration: Int = 0)(orElse: => A)(implicit app: Application, m: ClassManifest[A]): A = {
getAs[A](key).getOrElse {
val value = orElse
set(key, value, expiration)
value
}
}
想想这个场景:
因此,播放缓存插件有利于提供静态数据,这可能需要很长时间才能初始化。在这种情况下,通常多次初始化不是问题。
不要使用Cache来维护全局变量。