Spring MVC:提供多用户友好性

时间:2013-11-25 11:07:50

标签: spring 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线程安全吗?

我只想让我的spring MVC应用程序在多用户访问中正常工作。我能简单介绍一下吗?

2 个答案:

答案 0 :(得分:2)

是的,没关系。每个请求都在单独的线程中提供。所以每个线程都有自己的MyClass实例。 您可能遇到问题,您希望将MyClass作为具有单例范围的Spring bean,或者在MyClass对象访问数据库时(两种情况下共享资源)。在这种情况下,您需要同步线程。

答案 1 :(得分:2)

MyClass不是线程安全的。但它在控制器中的使用方式是线程安全的。正如您在MyClass方法中创建了home的实例:

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

        // using 'someVariable'

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

每个执行线程都将获得MyClass的单独实例。因此,一个应用程序线程在其自己的MyClass实例上所做的更改不会影响其他应用程序线程可用的其他实例。

但如果使用Spring控制器的默认范围,则someVariable的使用将不是线程安全的。默认范围是单例范围。这样,只有一个控制器实例可用,并且所有应用程序线程都可以使用相同的someVariable。因此,不建议在控制器中使用可变实例变量。即使String是不可变的,如果一个用户为其设置了新值,则其他用户也可以使用相同的值,因为只有一个someVariable可用。