Spring的bean是线程安全的吗?

结论:Spring不保证bean是线程安全的,spring不负责线程安全,这个是使用者进行控制的。

原因:Spring作为一个侵入性很低的框架,对解耦合的要求是很高的,加入要保证线程安全有两种方案。一个是单例模式,这种必定要进行加锁,这种对系统的侵害肯定是很严重的,会发生阻塞,严重影响程序运行。另外一种是每个进程新建一个,这就不是单例,而是多例了。这种基本可以保证线程安全,但是会占用资源。最主要的原因是没有必要,因为大部分的时间Bean 都是无状态的,所以某种程度上说是安全的。

那spring单例,为什么controller、service和dao确能保证线程安全?

Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理。

实际上大部分时间Bean是无状态的(比如Dao) 所以说在某种程度上来说Bean其实是安全的。

但是如果Bean是有状态的 那就需要开发人员自己来进行线程安全的保证,最简单的办法就是改变bean的作用域 把 "singleton"改为’‘protopyte’ 这样每次请求Bean就相当于是 new Bean() 这样就可以保证线程的安全了。

有状态就是有数据存储功能
无状态就是不会保存数据

controller、service和dao层本身并不是线程安全的,只是如果只是调用里面的方法,而且多线程调用一个实例的方法,会在内存中复制变量,这是自己的线程的工作内存,是安全的。

因此:
1、在@Controller/@Service等容器中,默认情况下,scope值是单例-singleton的,也是线程不安全的。
2、尽量不要在@Controller/@Service等容器中定义静态变量,不论是单例(singleton)还是多实例(prototype)他都是线程不安全的。
3、默认注入的Bean对象,在不设置scope的时候他也是线程不安全的。
4、一定要定义变量的话,用ThreadLocal来封装,这个是线程安全的

扫描二维码关注公众号,回复: 11369290 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_43221207/article/details/106141803