并发播放斯卡拉
问题描述:
假设你有一个播放Web应用程序下面的代码:并发播放斯卡拉
class MyClass extends Controller {
def myMethod = Action {
var a = 0
while (a < 1000) {
println("Value of a: " + a);
a = a + 1;
}
}
}
我能有一个竞争条件,如果两个用户/浏览器调用相同的方法?如果是,如何避免它?
答
号
a
每请求创建。
如果您要返回期货,请查看异步行为。
答
这将始终打印Value of a: 0
,因为a
是一个本地变量,您正在使用0
对每个请求进行初始化。
如果你声明它不在你的方法范围内,那么它可以作为一个计数器(如果你的控制器是一个单身人士),但是,你会有潜在的竞争条件。
解决它的一种方法是在您的控制器中使用一个AtomicInteger
的单例实例。你可以在这里看到更多细节:https://github.com/zoltanmaric/slike/blob/master/app/controllers/CountController.scala
在这种情况下,变量'a'是执行'Action'的'Future'的线程的本地,所以答案是** no **。如果'a'被声明为控制器的*字段,那么当然会有竞争状态。另一种引入问题的方式是制作更多'未来'/'线程'/'演员'参与改变'a'。 –
@ insan-e但这只适用于控制器是单身人士。如果它是按照每个请求创建的,那么应该没有问题。 –