Является ли переменная экземпляра Akka Actor поточно-ориентированной? - PullRequest
0 голосов
/ 22 января 2020

Я хочу рассчитать вход и выход актеров в моей системе. Там будет StatActor, когда он получит сообщение, он будет плюс переменная экземпляра. Я хочу знать, это потокобезопасно? Я запускал прототип кода несколько раз, он всегда был в порядке. Нужно ли использовать volatile или AtomicLong et c?

Код прототипа:

object VariableCountTest {

  def main(args: Array[String]): Unit = {

    val sys = ActorSystem()
    val stat = sys.actorOf(Props[Stat], "stat")
    val b = sys.actorOf(Props(classOf[Sender], stat), "b")
    val a = sys.actorOf(Props(classOf[Sender], stat), "a") //Two senders

    for (i <- 1 to 1000*1000*100) {
      if(i%3==0){
        b ! Stat.start
      }else{
        a ! Stat.start
      }
    }
  }

}



object Stat{
  case object stat;
  case object start;
  case object result;
}

class Stat extends Actor  with ActorLogging{

  var stat = 0L

  def receive = {
    case Stat.stat =>
      if(stat%100000==0){
        log.info("**"+stat)
      }
       stat = stat+1;
    case Stat.result =>
       sender() ! stat
  }

}



class Sender(target: ActorRef) extends Actor  with ActorLogging{

  def receive = {
    case Stat.start =>
      target ! Stat.stat
  }

}

Ответы [ 2 ]

1 голос
/ 22 января 2020

Да, в этом весь смысл модели актера :-) Я рекомендую прочитать, например, общий раздел или раздел модель памяти в документации.

0 голосов
/ 22 января 2020

Вам не нужны volatile или AtomicLong в одном экземпляре актера. Это по порядку.

Помните:

  1. По одному действующему по порядку.
  2. Параллельность - это поведение множественного действующего лица.
...