我通过网络搜索了这个问题,但对此问题并不清楚。
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应用程序在多用户访问中正常工作。我能简单介绍一下吗?
答案 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
可用。