Java 虚拟机栈是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是 Java 方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
《Java 并发编程实战》第 3.2.2 节:
局部变量的固有属性之一就是封闭在执行线程中。它们位于执行线程的栈中,其他线程无法访问这个栈。
所以其实任何无状态单例都是线程安全的。
Spring 的根本就是通过大量这种单例构建起系统,以事务脚本的方式提供服务。
首先问 @Controller @Service 是不是线程安全的?答:默认配置下不是的。为啥呢?因为默认情况下 @Controller 没有加上 @Scope,没有加 @Scope 就是默认值 singleton,单例的。意思就是系统只会初始化一次 Controller 容器,所以每次请求的都是同一个 Controller 容器,当然是非线程安全的。
举个例子:
@RestControllerpublic class TestController {
private int var = 0;`
@GetMapping(value = "/test_var")``public String test() {
System.out.println("普通变量var:" + (++var));
`return “普通变量var:” + var ;``}
}在 postman 里面发三次请求,结果如下:
普通变量 var