Spring中的Bean是线程安全的吗?

一、Bean的作用域

Spring容器中的bean的作用域有5个范围:
(1)singleton:默认的作用域,每个容器中只有一个bean的实例;
(2)prototype:为每一个bean请求提供一个实例;
(3)request:为每一个网络请求创建一个实例,请求完成后回收;
(4)session:确保每个session中有一个bean的实例,在session过期后,bean消失;
(5)global-session

二、Spring中的Bean是否线程安全

假设有一个Service类

@Service
public class MyServiceImpl implements MyService{
	public void doService(){
	}
}

一个Controller类:

@Controller
public class MyController{
	@Resource
	private MySerivce mySerivce;

	private void doRequest(){
		mySerivce.doService();
	}
}

(1)如果bean的作用域配置的是prototype,则每次注入都会创建一个新的bean对象,这样显然是线程安全的;

(2)如果bean的作用域配置的是singleton,则对于多次注入,都会是对同一个bean对象进行操作,绝对是线程不安全的;

对于Tomcat而言,会有专门的线程去监听某个端口上有没有请求过来,对于不同的请求,Tomcat会分发给不同的线程去进行处理,当多个线程并发去对一个bean进行操作时,显然是线程不安全的。
Spring中的Bean是线程安全的吗?_第1张图片

你可能感兴趣的:(java,spring)