为什么scala actor消息队列没有绑定(大小)

时间:2011-09-21 02:28:36

标签: scala actor

 def append(msg: Msg, session: OutputChannel[Any]) {
    changeSize(1) // size always increases by 1
    val el = new MQueueElement(msg, session)

    if (isEmpty) first = el
    else last.next = el

    last = el
  }

MQueue的append方法(actor的消息队列)没有最大大小。这不会导致outOfMemory吗?

并查看changeSize(1)

private var _size = 0

  def size = _size
  final def isEmpty = last eq null

  protected def changeSize(diff: Int) {
    _size += diff
  }

为什么没有@volatile与private var _size?
如果追加时间超过Int.maxValue会怎么样? 我们只是期望那些永远不会发生的事情吗?

1 个答案:

答案 0 :(得分:4)

对于问题的第一部分:是的,另请参阅此相关问题Actors Mailbox Overflow. Scala

我认为_size变量没有标记为volatile,因为这里预期调用方法负责同步。我简要地浏览了代码,并且调用此方法的actor库的各个部分确实标记为已同步。 对于整数溢出:我想确实预计这将永远不会发生。 最常用的actor库是Akka,它确实支持有界邮箱,有关​​语义和配置,请参阅this link。除此之外,他们将替换/与scala发行版中的actor库合并:as discussed recently on the mailing list