2013-11-25 12 views
2

我對這個問題進行了網絡瀏覽,但不清楚這個問題。Spring MVC:使多用戶友好

String someVariable; 
@RequestMapping(value = "/home",method = RequestMethod.GET) 
public String home(Model model) 
{ 
     MyClass ob = new MyClass(); 

     // using 'someVariable' 

     int r = ob.method1(); 
     //......... 
     //........ 
     return "something" 
} 

MyClass的

public class MyClass{ 
     int i=0; 
     public int method1(){ 
     // some operations on i 
     return i; 
     } 
} 

將在多用戶環境中,這Spring MVC的做工精細? MyClass線程在多用戶環境中安全嗎?

我只是想讓我的春天MVC應用程序正常工作,適合多用戶訪問。我可以簡單介紹一下嗎?

+0

你還沒有接受任何下面的答案。任何原因? –

回答

2

MyClass不是線程安全的。但它在控制器中的使用方式是線程安全的。正如你在你的home方法創建的MyClass一個實例:

public String home(Model model) 
{ 
     MyClass ob = new MyClass(); 

     // using 'someVariable' 

     int r = ob.method1(); 
     //......... 
     //........ 
     return "something" 
} 

執行的每個線程將獲得MyClass一個單獨的實例。因此,一個應用程序線程自己的MyClass實例所做的更改不會影響其他應用程序線程可用的其他實例。

但是如果您使用Spring控制器的默認範圍,則使用someVariable將不會是線程安全的。默認作用域是單例作用域。有了這個,你的控制器只有一個可用的實例,同樣的someVariable將可用於所有的應用程序線程。所以在控制器中使用可變實例變量是不可取的。即使String是不可變的,如果一個用戶爲其設置了新值,其他用戶也可以使用相同的值,因爲只有一個可用的someVariable

+0

那麼如何保護'someVariable'?初始化控制器內的MyClass是否好? – manish

+1

如果'someVariable'在初始化後沒有改變,那麼聲明它是'final'並且你很好。如果它對不同的線程有不同的值,最好把它聲明爲'home'方法的本地方法。聲明'MyClass'爲實例變量,只有它是不可變的,並且對於所有應用程序線程都是相同的。否則,您使用'MyClass'的方式是線程安全的。 –

2

是的,沒關係。每個請求都在單獨的線程中提供。所以每個線程都有自己的MyClass實例。 您可能會遇到問題,您希望將MyClass製作爲具有單例作用域的Spring bean,或者當MyClass對象訪問數據庫時(兩種情況都是共享資源)。在這種情況下,你需要同步線程。

+0

'someVariable'呢?它是線程安全的嗎? – manish

+0

只要someVariable是Controller屬性,但Controller是具有Singleton範圍的Spring bean,是的,您需要同步才能正常工作。 – mvb13

+0

在數據庫的情況下,我們可能會從'MyClass'內部的數據庫中獲得一些不一致的數據,但是對'MyClass'(及其變量)的訪問仍然是安全的嗎?您正在討論同步,我將如何同步經常使用的方法/類。如果我使用'同步'關鍵字不會消耗資源嗎? – manish