关于akka actor 修改相同变量

发布于 2022-09-02 19:54:18 字数 1088 浏览 25 评论 0

我预期我的代码结果会是500000,结果总是比500000多,是akka actor并不能保证并发修改数据的准确性还是我代码哪里有问题???

class Piao extends Actor{

  override def receive: Actor.Receive = {
    case "+" => Piao.i = Piao.i-1
  }
}

object Piao{
  var i = 1000000;
}


class HelloAkka extends Actor{
  val Actor = context.actorOf(Props[Piao], name = "piao")
  override def receive: Receive = {
    case "+" ⇒
      for(i <- 1 to 100000)
        Actor ! "+"

    case _   ⇒ println("received unknown message")
  }
}

class TestAkka extends Actor{
  val Actor = context.actorOf(Props[Piao], name = "piao")
  override def receive: Receive = {
    case "+" =>
      for(i <- 1 to 400000)
        Actor ! "+"

    case _   => println("ooo")
  }
}

object MyApp extends App{
  val system = ActorSystem("MySystem")
  val myActor = system.actorOf(Props[HelloAkka], name = "hellakka")
  val testActor = system.actorOf(Props[TestAkka], name = "TestAkka")
  val Actor = system.actorOf(Props[Piao], name = "piao")
  testActor ! "+"
  myActor ! "+"
  Thread.sleep(3000)
  println(Piao.i)
}

请大神解惑,谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

折戟 2022-09-09 19:54:19

actor能保证并发数据准确性,但是

object Piao{
  var i = 1000000;
}

并不能
HelloAkkaTestAkka可能会同时修改Piao.i,应当保证Piao.i同时只会被一个Actor修改,这样才能达到你要的效果

小巷里的女流氓 2022-09-09 19:54:19

一楼已经给出了正确答案。我在多解释一下,并不是akka actor不能保证并发修改数据的准确性,而是你实现错了。TestAkka和HelloAkka各自都创建了piao actor的实例,单个actor顺序执行,多个actor并行执行。因此如果想要得到正确结果,创建一个piao actor实例给TestAkka和Hello注入进去。

一些建议:1.i不应该放到Piao的伴生对象中;2.scala不用写分号;3.命名的大小写注意一下。

import akka.actor.{Actor, ActorRef, ActorSystem, Props}

class Piao extends Actor{

  override def receive: Actor.Receive = {
    case "+" => Piao.i = Piao.i-1
  }
}

object Piao{
  var i = 1000000;
}


class HelloAkka(Actor: ActorRef) extends Actor{
  override def receive: Receive = {
    case "+" ⇒
      for(i <- 1 to 100000)
        Actor ! "+"

    case _   ⇒ println("received unknown message")
  }
}

class TestAkka(Actor: ActorRef) extends Actor{
  override def receive: Receive = {
    case "+" =>
      for(i <- 1 to 400000)
        Actor ! "+"

    case _   => println("ooo")
  }
}

object MyApp extends App{
  val system = ActorSystem("MySystem")
  val Actor = system.actorOf(Props[Piao], name = "piao")
  val myActor = system.actorOf(Props.apply(classOf[HelloAkka], Actor), name = "hellakka")
  val testActor = system.actorOf(Props.apply(classOf[TestAkka], Actor), name = "TestAkka")
  testActor ! "+"
  myActor ! "+"
  Thread.sleep(3000)
  println(Piao.i)
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文