java - Spring MVC Controller : private shared methods.按值传递和线程安全

标签 java multithreading spring-mvc parameter-passing

我知道所有请求都由 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/

相关文章:

java.lang.ClassNotFoundException : org. sqlite.JDBC

Java:无法使用 "throw exception"时打印到文件

java - ThreadPoolExecutor 关闭 API 文档措辞 "does not wait"

java - 线程安全方法内的线程不安全对象

java - 多个 Spring 项目,共享身份验证

java - HTTP 连接错误 : close header

java - 使用 Spring AOP 处理异常时获取传递给方法的参数值

java - 如何在java中多线程查询数据50ms

java - “@RequiredArgsConstructor”和 'MismatchedInputException: Cannot construct instance'

Spring Data JPA – @Query – 不支持 DML 操作