Scala actor可以并发访问对象的共享缓存,scala.concurrent.Lock,react vs receive

时间:2012-09-26 08:27:24

标签: scala shared-memory actor locks

我正在编写一个软件,其中各个角色同时创建同一图形的一部分。

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

    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交织。在哪种情况下结构哈希停止工作(即,可以创建几个结构相同的节点,并且只有其中一个将存储在缓存中,结构相等将停止工作)。

首先,我知道这种结构哈希体系结构违背了actor无共享理念,但我们确实需要这种哈希才能出于性能原因(恒定时间平等带来一个数量级的改进),但有没有办法在与参与者级而不是jvm线程级工作的参与者的共享资源上实现互斥?

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

谢谢,

1 个答案:

答案 0 :(得分:0)

如果你有共享的可变状态,请让一个actor改变这种状态。你可以让其他演员阅读,但有一个演员可以写作。