我知道所有请求都由 Controller 的一个实例处理(单例,因为它是一个 Spring 管理的 bean)。
我还知道您不应该在实例变量中存储任何状态,因为它不是线程安全的。
但是看看这个
http://www.programcreek.com/2011/08/so-java-passes-object-by-reference-or-by-value/
下面的(伪)代码在线程安全方面可以吗?
我可以这样调用changeApple吗?按值传递可能会令人困惑,并且在 Spring Magic 中添加线程安全有时会让我担心......:)
@Controller
@SessionAtrribute("apple")
@RequestMapping("/foo")
public class FooController {
@Autowired
AppleRepository repository;
@RequestMapping("/method1")
public String method1(@ModelAttribute("apple") Apple apple) {
//do some method1 stuff
changeApple(apple);
repository.save(apple);
return "view1";
}
@RequestMapping("/method2")
public String method2(@ModelAttribute("apple") Apple apple) {
//do some method2 stuff
changeApple(apple);
repository.save(apple);
return "view2"
}
private void changeApple(Apple apple) {
//apple changing stuff
}
}
存储库会得到正确的苹果,并且正确的苹果会返回到 View 吗?
最佳答案
是的,这没问题,因为 apple 始终位于堆栈上并且不共享 - 也就是说,如果 apple 是请求参数。由于它是 SessionAttribute,因此同一 session 的两个请求很可能会同时调用,然后您将遇到不希望的竞争条件。
关于java - Spring MVC Controller : private shared methods.按值传递和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27347616/