Почему очередь сообщений актера scala не имеет ограничений (размер) - PullRequest
3 голосов
/ 21 сентября 2011
 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 (очередь сообщений субъекта) не имеет максимального размера.Разве это не вызывает 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 Ответ

4 голосов
/ 21 сентября 2011

Для первой части вашего вопроса: да, см. Также этот связанный вопрос Переполнение почтового ящика. Scala

Я думаю, что переменная _size не помечена как изменчивая, потому что здесь ожидается, что вызывающий метод позаботится о синхронизации. Я кратко просканировал код и различные части библиотеки актеров, которые вызывают этот метод, действительно помечены как синхронизированные. Для целочисленного переполнения: я предполагаю, что действительно ожидается, что это никогда не произойдет. Наиболее часто используемой библиотекой актеров является Akka, которая поддерживает ограниченные почтовые ящики, см. эту ссылку для семантики и конфигурации. Кроме того, они заменят / будут объединены с библиотекой актеров в дистрибутиве scala: , как недавно обсуждалось в списке рассылки .

...