我正在编写一个软件,其中各种参与者同时创建同一个图形的部分。
图的节点通过类层次结构建模,层次结构的每个具体类都有一个伴生对象。
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.concurrent.Lock 保护对该映射的访问。
然而问题在于 Lock 在 jvm 线程级别上运行,并且根据 actor 的编码方式,它们可以分配在它们自己的 jvm 线程上,或者与同一个 JVM 线程中的几个其他 actor 交错,在这种情况下结构哈希不再起作用(即,可以创建几个结构相同的节点,并且只有其中一个会存储在缓存中,结构相等性将不再起作用)。
首先,我知道这种结构化哈希架构违背了参与者无共享的理念,但是出于性能原因,我们确实需要这种哈希来工作(恒定的时间相等性给我们带来了一个数量级的改进),但是有没有办法实现相互与将在参与者级别而不是 jvm 线程级别工作的参与者共享资源的排除?
我想过将节点伴侣封装在一个actor中以完全顺序访问工厂,但这意味着对所有现有代码的完全重写,还有其他想法吗?
谢谢,