Scala参与者同时访问对象的共享缓存Scala.current.Lock,react vs receive



我正在编写一个软件,在该软件中,各个参与者同时创建同一图形的部分。

图的节点通过类层次结构进行建模,层次结构中的每个具体类都有一个伴随对象。

abstract class Node
class Node1(k1:Node, k2:Node) extends Node
object Node1 {
def apply(k1:Node, k2:Node) = ...
}
class Node2(k1:Node, k2:Node) extends Node
object Node2 {
def apply(k1:Node, k2:Node) = ...
}
...

到目前为止还不错。

我们在创建时对节点进行结构哈希。也就是说,每个伴随对象都有一个HashTable,它存储在其构造函数参数下键入的节点实例,用于检测具有相同子节点的给定节点类的实例是否已经存在,并返回该实例,而不是创建新实例。这可以避免内存膨胀,并允许进行一个需要恒定时间的节点相等性测试(引用比较而不是图形比较)。使用scala.current.Lock.保护对此地图的访问

然而,问题是Lock在jvm线程级别操作,并且根据参与者的编码方式,它们可以在自己的jvm线程上分配,或者与同一JVM线程中的几个其他参与者交错,在这种情况下,结构散列停止工作(即,可以创建几个结构相同的节点,并且其中只有一个将存储在高速缓存中,并且结构相等将停止工作)。

首先,我知道这种结构哈希架构违背了actor不共享的哲学,但出于性能原因,我们确实需要这种哈希来工作(恒定的时间平等会给我们带来数量级的改进),但有没有一种方法可以在共享资源上与actor实现互斥,从而在actor级别而不是jvm线程级别工作?

我曾想过将节点伴侣封装在actor中,以完全按顺序访问工厂,但这意味着要完全重写所有现有代码,还有其他想法吗?

谢谢,

如果您有共享的可变状态,那么就有一个单独的参与者来改变这个状态。你可以让其他演员阅读,但只有一个演员来写。

最新更新