学习记录.spring中的单例bean是线程安全的吗?

发布时间:2023年12月30日

作用域:

singleton(单例):spring默认作用域,每一个bean在容器中仅有一个实例.(因为只有一个实例,当多个线程都执行该实例的同一个业务逻辑(成员方法)并且这个业务逻辑有对bean自身的成员变量进行修改,就会存在线程安全问题)

prototype(原型):每次getbean都创建一个新实例.(你有我有大家有,自然不存在竞争,也不存在线程安全问题了)


无状态bean:对于自身的成员变量只查询,不修改的bean,即不会做数据存储的bean.

有状态bean:对于自身的成员变量会做修改的bean,即有数据存储功能的bean.


答:spring并没有提供线程安全策略,因此,spring的单例bean其本身是不具备线程安全的特性的.

但是我们经常在项目中使用的bean都是无状态bean,比如Service类和Dao类.所以从某种程度上来说spring的单例bean是线程安全的.

?如果确实需要使用有状态bean,最简单的方法是将@Scope注解的值改为prototype.

或者将会变的成员变量保存在ThreadLocal中,TreadLocal本身具备线程隔离的特性,这样的话,每个线程都有自己的变量副本,只需要操作自己的变量副本就行.


总结:spring的单例bean本身不具备线程安全特性.如果使用无状态bean,则不需要考虑线程安全问题;如果使用有状态bean,就需要开发者自己保证线程安全和并发问题.


参考文章:

Spring中的Bean是线程安全的吗? - 知乎 (zhihu.com)

Spring 中的bean 是线程安全的吗? - myseries - 博客园 (cnblogs.com)

文章来源:https://blog.csdn.net/sixuyuyu/article/details/135297131
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。