2016-11-07 130 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