spring在什么情况下线程不安全

1.Spring作为一个IOC/DI容器,帮助我们管理了许许多多的”bean”,但其实,Spring并没有保证这些对象的线程安全,需要由开发者自己编写解决线程安全问题的代码.
2.我们交由Spring管理的大多数对象其实都是一些无状态的对象,这种不会因为多线程而导致状态被破坏的对象适合Spring的默认scope,每个单里的无状态对象都是线程安全的(也就是说只要是无状态的对象,不管单例多例都是线程安全的,不过单例毕竟节省了不断创建对象与GC的开销).
3.无状态的对象即是自身没有状态的对象,自然也就不会因为多个线程的交替调度而破坏自身状态导致线程安全问题,无状态对象包括我们经常使用DO,DTO,VO这些只作为数据的实体模型的贫血对象,还有Service,DAO和Controller,这些对象并没有自己的状态,它们只是用来执行某些操作的.例如,每个DAO提供的函数都只是对数据的CRUD,而且每个数据库Connection都作为函数的局部变量(局部变量是在用户栈中的,而且用户栈本身就是线程私有的内存区域,所以不存在线程安全为题),用完即关(或交还给连接池).
4.有人可能认为,我使用request作用域不就可以避免每个请求之间的安全问题了吗?这是完全错误的,因为Controller默认是单例的,一个Http请求是会被多个线程执行的,这就又回到了线程安全问题.当然,你可以把Controller的scope改成prototype,但是Spring MVC对请求的拦截粒度是基于每个方法的,所以把Controller设为多例将会频繁的创建与回收对象,严重影响到了性能. 5.Spring根本没有对bean的多线程安全问题作出任何保证与措施,对于每个bean的线程安全问题,根本原因是每个bean自身的设计,不要在bean中声明任何有状态的实例变量或类变量,如果必须如此,那么就只能使用ThreadLocal把变量变为线程私有的,如果bean的实例变量或类变量需要在多个线程之间共享,那么就只能使用synchronized,lock,CAS等这些实现线程同步的方法了.
注:
1.有状态对象就是有数据存储功能,有状态对象就是实例变量对象,可以保存数据,是非线程安全的,在不同方法调用间不保留任何状态.其实就是有数据成员的对象.
2.无状态就是一次操作,不能保存数据,无状态对象,就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的,具体就是只有方法没有数据成员的对象,或者有数据成员但是数据成员是可读的对象.

扫描关注下面二维码获得更多有用的资源!
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值