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库中:正如最近在邮件列表中讨论的那样。