Scala 全局可变引用对象,该对象将获得';s通过演员交换

Scala 全局可变引用对象,该对象将获得';s通过演员交换,scala,playframework,akka,Scala,Playframework,Akka,我想创建一个全局范围变量,该变量具有一个可变引用,但使用一个不可变对象,例如 var globalMap = Map("a" -> 1, "b" -> c) 现在我想在我所有的控制器中使用这个globalMap,你怎么能在游戏中这样做 我想创建一个akka actor,它将使用计时器,每x秒它将创建一个新的映射,该映射将通过从db读取来初始化,然后成为globalMap变量的新引用 注意:我不是在找人说这是糟糕的设计等等,我只是想了解这是否可能,以及如何在游戏中进行操作。像没有游戏

我想创建一个全局范围变量,该变量具有一个可变引用,但使用一个不可变对象,例如

var globalMap = Map("a" -> 1, "b" -> c)
现在我想在我所有的控制器中使用这个
globalMap
,你怎么能在游戏中这样做

我想创建一个akka actor,它将使用计时器,每x秒它将创建一个新的映射,该映射将通过从db读取来初始化,然后成为
globalMap
变量的新引用


注意:我不是在找人说这是糟糕的设计等等,我只是想了解这是否可能,以及如何在游戏中进行操作。

像没有游戏一样进行操作。将其放在对象
地图夹中
。从具有以下特性的特性继承控制器:

def globalMap = MapHolder.globalMap

这太容易了。。。是否还需要其他内容?

要使某些值始终可供一组读卡器(线程、控制器,无所谓)使用,需要正确发布新值。第一部分是同步,这样最多只能同时运行一个更新,您可以通过使用Actor来解决这个问题(还有其他方法,但是Actor可以工作)。第二部分是在编写器和读取器之间进行同步,以便它们只看到正确初始化和一致的对象,而不是一些随机垃圾。幸运的是,JVM有一个定义相当好的内存模型,所以只需要将变量标记为
@volatile

对于另一种实现,您可能希望检查此问题的预打包解决方案,例如:


然后,您的更新程序(如果您想方便地安排事情,可能仍然是参与者,但现在可以是代码的任何部分)只使用
send
(或者
alter
,如果您需要知道修改何时生效)在读者使用
get
获取当前值时更新该值。

我想在您推荐后使用它,但现在已弃用:
Akka 2.5.13弃用警告
-
代理已弃用,计划在下一个主要版本中删除。我们发现他们漏洞百出的抽象(他们不在网络上工作)使他们不如纯粹的参与者,面对即将加入的Akka类型,我们认为维护当前代理几乎没有什么价值。
只要您停留在一个JVM内,就可以使用一个只由一个参与者编写的易失性静态字段,该参与者向其写入不可变的对象引用。
import akka.agent.Agent

object MyGlobal {
  val theMap = Agent(Map.empty[String, Int])
}