为什么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(actor的消息队列)的append方法没有最大大小限制。这不会导致内存溢出吗?

查看changeSize(1)

private var _size = 0
  def size = _size
  final def isEmpty = last eq null
  protected def changeSize(diff: Int) {
    _size += diff
  }

为什么没有@volatile和私有var _size ?
如果追加次数超过Int.maxValue怎么办?
难道我们就指望这些永远不会发生吗?

对于您问题的第一部分:是的,请参见此相关问题演员邮箱溢出。Scala

我认为_size变量没有被标记为volatile,因为这里期望调用方法负责同步。我简单地浏览了一下代码,调用这个方法的actor库的各个部分确实被标记为同步。对于整数溢出:我想这确实是期望永远不会发生的。最常用的actor库是Akka,它确实支持有界邮箱,请参阅此链接了解语义和配置。除此之外,它们将取代/合并到scala发行版中的actors库中:正如最近在邮件列表中讨论的那样。

最新更新