2016-11-07 2 views
1

Предположим, у вас есть следующий код в веб-приложение Play:Параллелизм в Play для Scala

class MyClass extends Controller { 

    def myMethod = Action { 

     var a = 0 

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

    } 

} 

Могу ли я иметь состояние гонки, если два пользователя/браузеры вызывать тот же метод? Если да, то как этого избежать?

+0

В этом случае переменная 'a' является локальной для потока, которая выполняет' '' '' '' '' '' '' '' '' '' ', поэтому ответ ** нет **. Если 'a' было объявлено как * поле * контроллера, то, конечно, у него было бы состояние гонки. Еще один способ ввести проблемы - сделать более '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ',' –

+0

@ insan-e, но это применимо только в том случае, если контроллер является одиночным. Если он создается вместо запроса, тогда проблем не должно быть. –

ответ

3

No.

a создается для каждого запроса.

Также проверьте действие async, если вы возвращаете фьючерсы.

2

Это всегда будет печатать Value of a: 0, потому что a является локальной переменной, и вы инициализируете ее 0 по каждому запросу.

Если вы объявили его вне сферы действия вашего метода, тогда он может работать как счетчик (если ваш контроллер является одиночным), но да, у вас будут потенциальные условия гонки.

Один из способов решения этой проблемы - использовать экземпляр singleton AtomicInteger в вашем контроллере. Вы можете увидеть более подробную информацию об этом здесь: https://github.com/zoltanmaric/slike/blob/master/app/controllers/CountController.scala

+1

Хотя это, вероятно, будет технически работать, я бы не рекомендовал/не советовал такие вещи новичкам. Особенно, если мы говорим о неотъемлемой структуре без гражданства здесь (по крайней мере, это цель). – rethab

+0

@rethab Я полностью согласен с тобой –

+0

Почему вы говорите «вы инициализируете его с помощью 0 на каждый запрос», если я увеличиваю 'a' в цикле? – ps0604

Смежные вопросы