Я хочу рассчитать вход и выход актеров в моей системе. Там будет 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
}
}