【问题标题】:Strange behavior from akka actor in scala concurrent programmingscala并发编程中akka actor的奇怪行为
【发布时间】:2020-07-03 14:56:26
【问题描述】:

我的代码:


我用相同的数字运行了 3 次,输出:

错了!

the FibonacciNumber test Started!!!
the FibonacciNumber(8) is 
 20

这是正确的

the FibonacciNumber test Started!!!
the FibonacciNumber(8) is 
 21

错了!

the FibonacciNumber test Started!!!
the FibonacciNumber(8) is 
 19

【问题讨论】:

  • @jwvh 很好发现。但至少 OP 是在寻求解决方案的帮助,而不是要求我们给他们答案:)

标签: akka-actor


【解决方案1】:

拥有一个由多个参与者同时更新的全局变量是不安全的。多个参与者可以同时处理消息,如果两个或更多参与者尝试同时更新这些变量,则不会给出正确的结果。所以用这个算法你至少需要把counterresult变成AtomicInteger

最好改进算法以避免全局变量。状态信息应该使用请求和回复在参与者之间传递,而不是在多个参与者同时访问的变量中

【讨论】:

  • 所以我将创建“val counter = new AtomicInteger(0)”,而不是让计数器执行“counter += 1”,现在我执行“counter.incrementAndGet”?我应该把计数器的增量移到“case add() =>”下面吗?
  • 你可以在你目前有+= 1的地方调用incrementAndGet,但我强烈建议你重新设计这段代码以避免全局变量。特别是如果这是一个班级项目......
  • 感谢您的建议,我修复了我的代码。现在它一直给我正确的结果。
猜你喜欢
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多