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

Spring中的Bean默认并非线程安全,Singleton作用域的Bean在多线程环境下可能存在并发问题。若Bean无实例变量或使用线程安全的变量如ConcurrentHashMap,则可能是线程安全的。Prototype和request作用域分别在每次请求和每个HTTP请求时创建新实例。无状态Bean是线程安全的,而有状态Bean需要关注线程安全问题。Spring通过ThreadLocal处理部分Bean以实现线程安全。
摘要由CSDN通过智能技术生成

答案:绝不可能是线程安全的,不是线程安全的,也不绝对是线程不安全的

Spring容器中的bean可以分为5个范围

  1. singleton:默认,每个容器中只有一个bean的实例
  2. prototype:为每一个bean请求提供一个实例

以下三种99.99%不用

  1. request:为每一个网络请求创建一个实例,在请求完成后,bean会失效并被垃圾回收器回收
  2. session:确保每个session中有一个bean的实例,在session过期后,bean会随之消失
  3. gloal-session

Tomcat中可能多个线程去请求同一个bean对象实例(例如调用同一个Controller),因为spring默认创建的bean是singleton的,都是线程不安全的。如果在spring的Service或是Controller中没放什么实例变量,那么这个时候就没什么问题,最终的效果可能是多个线程并发去访问数据库(正常的逻辑是在业务代码中访问数据库)

如果单实例的变量放的是例如ConcurrentHashMap这种线程安全的数据结构,那么多线程并发访问的话,是线程安全的。

@Service
public class MyServiceImpl implements MyService{
    public void doService(){
        //执行方法    
    }
}

&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值