2016-11-07 1 views
1

Supposons que vous avez le code suivant dans une application web Play:Concurrency en jeu pour Scala

class MyClass extends Controller { 

    def myMethod = Action { 

     var a = 0 

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

    } 

} 

que je pourrais avoir une condition de course si deux utilisateurs/navigateurs invoquent la même méthode? Si oui, comment l'éviter?

+0

Dans ce cas, la variable 'a' est locale à thread qui exécute le' Future' de 'Action', donc la réponse est ** non **. Si le 'a' a été déclaré comme * champ * du contrôleur alors, bien sûr, il aurait des conditions de concurrence. Une autre façon d'introduire des problèmes est de faire en sorte que '' Acteurs'/'Thread's /' Future's/'Acteurs' soit impliqué dans le changement de' a'. –

+0

@ insan-e mais cela n'est applicable que si le contrôleur est un singleton. Si c'est créé par requête, il ne devrait pas y avoir de problèmes. –

Répondre

3

n °

a est créé par demande.

Vérifiez également l'action async si vous renvoyez des contrats à terme.

2

Ceci affichera toujours Value of a: 0, car a est une variable locale et vous l'initialisez avec 0 à chaque requête.

Si vous l'avez déclaré hors de la portée de votre méthode, alors cela pourrait fonctionner comme un compteur (si votre contrôleur est un singleton), mais oui, vous auriez des conditions de concurrence potentielles. Une solution consiste à utiliser une instance singleton d'un AtomicInteger dans votre contrôleur. Vous pouvez voir plus de détails à ce sujet ici: https://github.com/zoltanmaric/slike/blob/master/app/controllers/CountController.scala

+1

Bien que cela fonctionnerait probablement techniquement, je ne recommanderais pas/conseiller de telles choses aux débutants. Surtout si nous parlons d'un cadre intrinsèquement apatride ici (du moins c'est le but). – rethab

+0

@rethab Je suis complètement d'accord avec vous –

+0

pourquoi dites-vous 'vous l'initialisez avec 0 sur chaque demande' si j'incrémente' a' dans la boucle? – ps0604