Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala/akka中锁定数据结构上的读/写操作_Scala_Concurrency_Locking_Akka_Locks - Fatal编程技术网

在Scala/akka中锁定数据结构上的读/写操作

在Scala/akka中锁定数据结构上的读/写操作,scala,concurrency,locking,akka,locks,Scala,Concurrency,Locking,Akka,Locks,我有多个参与者(以未来的形式)根据他们从单个对象缓存中读取的内容触发其他未来。我希望确保没有工作重叠,因此希望锁定所有读/修改/写操作。在Scala中如何实现这一点 我尝试了这个方法,但我不希望访问缓存的每个方法/函数都必须同步,而是让尝试访问缓存的任何东西都明白,它需要等到它访问的时候 //The cache object certCache { var cache = new HashMap[Char, Future[Boolean]] } def someMethod = s

我有多个参与者(以未来的形式)根据他们从单个对象缓存中读取的内容触发其他未来。我希望确保没有工作重叠,因此希望锁定所有读/修改/写操作。在Scala中如何实现这一点

我尝试了这个方法,但我不希望访问缓存的每个方法/函数都必须同步,而是让尝试访问缓存的任何东西都明白,它需要等到它访问的时候

//The cache    
object certCache {
  var cache = new HashMap[Char, Future[Boolean]]
}

def someMethod = synchronized {
   if(certCache ... ) 
   certCache.do(...)
}
有什么建议吗?

代理 akka库为您的问题提供了完美的解决方案:。从:

要从代理读取,可以取消引用它们或调用get方法,这两种方法都会立即返回同步调用:

val agentResult = agent()
val agentResult2 = agent.get
更新是异步的:

agent send (_ + 10) //updates value to 52, eventually
类似地,您可以在当前排队的更新完成后获得代理的值的
Future

val futureValue = agent.future
演员 当然,您可以始终使用“自行开发”的解决方案,编写一个Actor来缓存您的值并响应查询。但是,与代理相比,这是一个更加手动/低效的解决方案


只有在其他akka/scala解决方案不适用时,才应将参与者视为最后手段。这是因为参与者的级别非常低,并且接收方法不可组合

我不会为此使用锁定,但有某种可观察(或基于事件)的机制来通知客户您的未来已经完成。将您的单个对象放在参与者后面,以便任何想要查询它的人都必须向参与者发送消息并等待答复?那么你就不需要同步了,因为一个参与者一次只处理一条消息,所以同步访问永远不会出现。酷!我正在这么做。
val futureValue = agent.future