spring单例问题,多线程访问单例controller怎么处理的?

在spring中controller对象默认是单例的,那么在同一时间有两个请求到这个controller;请求中的数据肯定是不同的,一个对象怎么处理两个请求,两份不同的数据呢。

@RestController
public class TestController{

  @RequestMappin("/test01")
  public String test01(){
    return "response";
  }
}

例如上面的代码,两个人同时访问test01地址,它们携带的数据肯定不一样;单例的TestController怎么处理的请求呢。

Controller 执行方法,并没有操作全局变量。这个是线程安全的。

想想什么样的数据,才会有线程安全的问题,然后考虑下这里,是不是属于这些类型中的一类

1、spring单利的controller 类中,只能声明方法,不能声明属性;
2、spring多利的controller 类中,才可以声明属性;

spring中的controller 中每一个controller 方法,对应一个servlet实例,那么传入的参数数据均属于servlet线程安全。每一个请求就是servlet的一个线程实例。

类的方法是存放在方法区里的,而单例对象只是说堆里存放的类的属性值只有一份,当你用不同线程调用单例对象的方法时,两个线程会同时创建不同的方法栈,用于保存局部变量,所以,两者之间互不干涉

congtroller是单例的,但是请求过来是可以并发的,也就是说两个人同时访问,就是两个线程都拿到同一个Controller实例,并发处理各自的请求,没毛病 啊

  1. 首先,说下你问题描述的不是很清楚;我理解你的问题意思是:一个对象看似只有一个入口,那么一个入口是怎么同时处理两个请求的,是吗?
  2. 如果是上述意思的话,你应该好好了解下,内存模型,主要是其中的“栈”,它是线程私有的。
  3. 大概流程:进程给不同的请求分配不同的线程,一一对应,然后每个线程操作的是私有的栈。栈里面是一个一个“栈帧”,每个栈帧对应一次方法调用。线程间是隔离的,互不影响。也即:并发的请求都是独立的线程,互不影响。各自处理这私有的数据。
    额外多数点:如果要操作共享数据,比如这个单例的属性值(对象是在堆里面),并发操作堆里面共享数据,这时候就会有并发问题。