Java SpringMVC控制器中的私有方法是线程安全的
据我所知,SpringMVC控制器在默认情况下是线程安全的(比如servlet)。但我只想知道控制器中的任何私有helper方法都是线程安全的 我在控制器类中有两个映射,例如:/test和test/success。每次用户调用此url时,我都希望使用服务方法(两个不同的调用)检查数据库中的用户状态和激活时间。因此,我决定创建一个one-private helper方法来检查状态。Java SpringMVC控制器中的私有方法是线程安全的,java,multithreading,spring,spring-mvc,Java,Multithreading,Spring,Spring Mvc,据我所知,SpringMVC控制器在默认情况下是线程安全的(比如servlet)。但我只想知道控制器中的任何私有helper方法都是线程安全的 我在控制器类中有两个映射,例如:/test和test/success。每次用户调用此url时,我都希望使用服务方法(两个不同的调用)检查数据库中的用户状态和激活时间。因此,我决定创建一个one-private helper方法来检查状态。 那么有人知道我的私有方法是线程安全的吗?所有请求都由控制器的一个实例处理(singleton,因为它是spring管
那么有人知道我的私有方法是线程安全的吗?所有请求都由控制器的一个实例处理(singleton,因为它是spring管理的bean)。因此,您需要确保不存储与一个请求相关的任何状态(在字段中) 因此: 可以,但是:
@Controller
@RequestMapping("/foo")
public class Foo {
private User theUser; // problem is ALL request share this field
@RequestMapping("/foo/{userId}")
public String foo(@PathVariable final Integer userId) {
if (theUser.getId().equals(userId)) {
// something
} else {
theUser = ...
}
return "view"
}
}
事实并非如此
NB:未测试(仅在此处键入,这样可能会损害编译器)所有请求都由控制器的一个实例处理(singleton,因为它是spring管理的bean)。因此,您需要确保不存储与一个请求相关的任何状态(在字段中) 因此: 可以,但是:
@Controller
@RequestMapping("/foo")
public class Foo {
private User theUser; // problem is ALL request share this field
@RequestMapping("/foo/{userId}")
public String foo(@PathVariable final Integer userId) {
if (theUser.getId().equals(userId)) {
// something
} else {
theUser = ...
}
return "view"
}
}
事实并非如此
NB:未测试(仅在此处键入,这样可能会损害编译器)不,您在这两个方面都完全错了:spring mvc控制器在默认情况下是线程安全的(如servlet)可见性与线程安全有什么关系?默认情况下,singleton中的mvc控制器以及当请求到来时,将像servlets生命周期一样调用新线程?那么,线程安全性如何?我要说的是,映射方法中的任何局部变量都是线程安全的。不是一个实例变量。好的,这是完全不同的。这并不能保证类线程本身的安全性。而且
private
与线程安全无关。不,您在这两个方面都是完全错误的:spring mvc控制器在默认情况下是线程安全的(像servlet)可见性与线程安全有什么关系?默认情况下,singleton中的mvc控制器以及当请求到来时,将像servlets生命周期一样调用新线程?那么,线程安全性如何?我要说的是,映射方法中的任何局部变量都是线程安全的。不是一个实例变量。好的,这是完全不同的。这并不能保证类线程本身的安全性。而且private
与线程安全无关。是的。我应该避免使用私人方法。所以我想我需要调用服务方法或者在两个映射方法中编写相同的逻辑?这正是我要问的。。。。我决定像第一个例子那样做。如果多个用户同时调用同一个url,这是线程安全的吗?是的,但最佳实践建议不要在控制器中放置任何逻辑I抱歉,但我丢失了,我的示例代码是两个相反的东西,你应该编辑你的问题并添加代码。是的,你只是“使用”它,你不分配给它。由于它是由spring自动连接的,所以它是在bean实例化/构造Yes中完成的。我应该避免使用私人方法。所以我想我需要调用服务方法或者在两个映射方法中编写相同的逻辑?这正是我要问的。。。。我决定像第一个例子那样做。如果多个用户同时调用同一个url,这是线程安全的吗?是的,但最佳实践建议不要在控制器中放置任何逻辑I抱歉,但我丢失了,我的示例代码是两个相反的东西,你应该编辑你的问题并添加代码。是的,你只是“使用”它,你不分配给它。由于它是由spring自动连接的,所以它是在bean实例化/构造时完成的