Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。
最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”。
spring单例模式下,资源是否是线程安全的,跟是不是单例没关系,主要看资源是否存在共享情况,如果存在共享情况,在需要解决线程安全问题
一、局部变量,不存在线程安全问题,因为每个请求都是一个线程请求,局部变量都在线程内不共享
@RestController
public class TestController {
@RequestMapping("testBean")
public int sayHello() {
int count = 0;
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
return count;
}
}
二、全局变量,存在线程安全问题,全局变量是共享数据
@RestController
public class TestController {
private int count=0;
@RequestMapping("testBean")
public int sayHello() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
return count;
}
}