学习记录.spring中的单例bean是线程安全的吗?
2023-12-30 23:39:44
作用域:
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,就需要开发者自己保证线程安全和并发问题.
参考文章:
文章来源:https://blog.csdn.net/sixuyuyu/article/details/135297131
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!