2016-11-07 115 views
1

假设你有一个播放Web应用程序下面的代码:并发播放斯卡拉

class MyClass extends Controller { 

    def myMethod = Action { 

     var a = 0 

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

    } 

} 

我能有一个竞争条件,如果两个用户/浏览器调用相同的方法?如果是,如何避免它?

+0

在这种情况下,变量'a'是执行'Action'的'Future'的线程的本地,所以答案是** no **。如果'a'被声明为控制器的*字段,那么当然会有竞争状态。另一种引入问题的方式是制作更多'未来'/'线程'/'演员'参与改变'a'。 –

+0

@ insan-e但这只适用于控制器是单身人士。如果它是按照每个请求创建的,那么应该没有问题。 –

回答

3

a每请求创建。

如果您要返回期货,请查看异步行为。

2

这将始终打印Value of a: 0,因为a是一个本地变量,您正在使用0对每个请求进行初始化。

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

解决它的一种方法是在您的控制器中使用一个AtomicInteger的单例实例。你可以在这里看到更多细节:https://github.com/zoltanmaric/slike/blob/master/app/controllers/CountController.scala

+1

虽然这可能会在技术上起作用,但我不会向初学者推荐/建议这样的事情。特别是如果我们在这里谈论一个固有的无状态框架(至少这是目标)。 – rethab

+0

@rethab我完全同意你的意见 –

+0

如果我在循环中增加'a',你为什么要说'你在每个请求上用0初始化它? – ps0604