目录
写一个控制层的类
验证方法
编辑
分别执行如下请求,先执行等待时间久的
日志结果
结论
配置多例模式
配置文件application.properties
类加注解
配置类方式
写一个控制层的类
package com.example.ctr;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
@Slf4j
public class Api {
int cc = 0;
static int ccs = 0;
@RequestMapping("/sleep/{num}")
public String sleep(@PathVariable int num) throws InterruptedException {
cc = num;
ccs = num;
int s = num;
log.info(Thread.currentThread().getName()+" "+num+" start 方法级变量="+s+"类级变量=" +cc +" 类级静态变量="+ccs);
Thread.sleep(num);
log.info(Thread.currentThread().getName()+" "+num+" end 方法级变量="+s+"类级变量=" +cc +" 类级静态变量="+ccs);
return "ok 方法级变量="+s+"类级变量=" +cc +" 类级静态变量="+ccs;
}
}
验证方法
分别执行如下请求,先执行等待时间久的
http://localhost:8101/api/sleep/60000
http://localhost:8101/api/sleep/30000
http://localhost:8101/api/sleep/10000
http://localhost:8101/api/sleep/5000
http://localhost:8101/api/sleep/1000
日志结果
2023-07-03 14:19:06.616 INFO 33444 --- [nio-8101-exec-1] com.example.ctr.Api : http-nio-8101-exec-1 60000 start 方法级变量=60000类级变量=60000 类级静态变量=60000
2023-07-03 14:19:07.171 INFO 33444 --- [nio-8101-exec-2] com.example.ctr.Api : http-nio-8101-exec-2 30000 start 方法级变量=30000类级变量=30000 类级静态变量=30000
2023-07-03 14:19:08.318 INFO 33444 --- [nio-8101-exec-3] com.example.ctr.Api : http-nio-8101-exec-3 10000 start 方法级变量=10000类级变量=10000 类级静态变量=10000
2023-07-03 14:19:09.705 INFO 33444 --- [nio-8101-exec-4] com.example.ctr.Api : http-nio-8101-exec-4 5000 start 方法级变量=5000类级变量=5000 类级静态变量=5000
2023-07-03 14:19:11.277 INFO 33444 --- [nio-8101-exec-5] com.example.ctr.Api : http-nio-8101-exec-5 1000 start 方法级变量=1000类级变量=1000 类级静态变量=1000
2023-07-03 14:19:12.286 INFO 33444 --- [nio-8101-exec-5] com.example.ctr.Api : http-nio-8101-exec-5 1000 end 方法级变量=1000类级变量=1000 类级静态变量=1000
2023-07-03 14:19:14.707 INFO 33444 --- [nio-8101-exec-4] com.example.ctr.Api : http-nio-8101-exec-4 5000 end 方法级变量=5000类级变量=1000 类级静态变量=1000
2023-07-03 14:19:18.322 INFO 33444 --- [nio-8101-exec-3] com.example.ctr.Api : http-nio-8101-exec-3 10000 end 方法级变量=10000类级变量=1000 类级静态变量=1000
2023-07-03 14:19:37.181 INFO 33444 --- [nio-8101-exec-2] com.example.ctr.Api : http-nio-8101-exec-2 30000 end 方法级变量=30000类级变量=1000 类级静态变量=1000
2023-07-03 14:20:06.628 INFO 33444 --- [nio-8101-exec-1] com.example.ctr.Api : http-nio-8101-exec-1 60000 end 方法级变量=60000类级变量=1000 类级静态变量=1000
可见 执行久的线程,在运行中 对象级的变量,再新请求来后变量发生改变
结论
方法级变量线程安全
对象级变量和静态变量都不安全
ok
持续更新
配置多例模式
配置文件application.properties
spring.main.allow-bean-definition-overriding=true
类加注解
@Component
@Scope("prototype")
public class MyBean {
//...
}
配置类方式
@Configuration
public class MyConfig {
@Bean
@Scope("prototype")
public MyBean myBean(){
return new MyBean();
}
}
ok
持续更新