关于akka actor 修改相同变量
我预期我的代码结果会是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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
actor能保证并发数据准确性,但是
并不能
HelloAkka
和TestAkka
可能会同时修改Piao.i,应当保证Piao.i同时只会被一个Actor修改,这样才能达到你要的效果一楼已经给出了正确答案。我在多解释一下,并不是akka actor不能保证并发修改数据的准确性,而是你实现错了。TestAkka和HelloAkka各自都创建了piao actor的实例,单个actor顺序执行,多个actor并行执行。因此如果想要得到正确结果,创建一个piao actor实例给TestAkka和Hello注入进去。
一些建议:1.i不应该放到Piao的伴生对象中;2.scala不用写分号;3.命名的大小写注意一下。