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
假设您在 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