Play for Scala 中的并发性

Concurrency in Play for Scala

假设您在 Play 网络应用程序中有以下代码:

class MyClass extends Controller  {

  def myMethod = Action {

      var a = 0

      while ( a < 1000 ) {
         println( "Value of a: " + a );
         a = a + 1;
      }

  }

}

如果两个 users/browsers 调用相同的方法,我会出现竞争条件吗?如果是,如何避免?

没有

a 根据请求创建。

如果您要返回 Futures,还请检查异步操作。

这将始终打印 Value of a: 0,因为 a 是一个局部变量,并且您在每次请求时使用 0 对其进行初始化。

如果你在你的方法范围之外声明它,那么它可以作为一个计数器(如果你的控制器是单例),但是,是的,你会有潜在的竞争条件。

解决它的一种方法是在控制器中使用 AtomicInteger 的单例实例。您可以在此处查看更多详细信息:https://github.com/zoltanmaric/slike/blob/master/app/controllers/CountController.scala