1

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

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

    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中以完全顺序访问工厂,但这意味着对所有现有代码的完全重写,还有其他想法吗?

谢谢,

4

1 回答 1

0

如果您共享了可变状态,请使用一个改变此状态的参与者。您可以让其他演员阅读,但让一名演员负责写入。

于 2012-09-26T12:14:17.050 回答