• Spring中什么样的Bean存在线程安全问题-有状态bean


    1、Spring中Bean

    从哪里来的?

    在Spring容器中,除了很多Spring内置的Bean以外,其他的Bean都是我们自己通过Spring配置来声明的,然后,由Spring容器统一加载。我们在Spring声明配置中通常会配置以下内容,如:class(全类名)、id(也就是Bean的唯一标识)、 scope(作用域)以及lazy-init

    (是否延时加载)等。之后,Spring容器根据配置内容使用对应的策略来创建Bean的实例。因此,Spring容器中的Bean其实都是根据我们自己写的类来创建的实例。因此,Spring中的Bean是否线程安全,跟Spring容器无关,只是交由Spring容器托管而已。

    那么,在Spring容器中,什么样的Bean会存在线程安全问题呢?回答,这个问题之前我们得先回顾一下Spring Bean的作用域。在Spring定义的作用域中,其中有 prototype( 多例Bean )和 singleton ( 单例Bean)。那么,定义为 prototype

    的Bean,是在每次 getBean 的时候都会创建一个新的对象。定义为 singleton 的Bean,在Spring容器中只会存在一个全局共享的实例。基于对以上Spring Bean作用域的理解,下面,我们来分析一下在Spring容器中,什么样的Bean会存在线程安全问题。

    2、Spring中什么样的Bean存在线程安全问题?

    我们已经知道,多例Bean每次都会新创建新实例,也就是说线程之间不存在Bean共享的问题。因此,多例Bean

    是不存在线程安全问题的。

    而单例Bean是所有线程共享一个实例,因此,就可能会存在线程安全问题。但是单例Bean又分为无状态Bean和有状态Bean

    。在多线程操作中只会对Bean的成员变量进行查询操作,不会修改成员变量

    的值,这样的Bean称之为无状态Bean。所以,可想而知,无状态的单例Bean是不存在线程安全问题的。但是,在多线程操作中如果需要对Bean中的成员变量进行数据更新操作,这样的Bean称之为有状态Bean,所以,有状态的单例Bean就可能存在线程安全问题。

    所以,最终我们得出结论,在Spring中,只有有状态的单例Bean才会存在线程安全问题。我们在使用Spring的过程中,经常会使用到有状态的单例Bean

    ,如果真正遇到了线程安全问题,我们又该如何处理呢?

    3、如何处理Spring Bean的线程安全问题?

    处理有状态单例Bean的线程安全问题有以下三种方法:

    1、将Bean的作用域由 “singleton” 单例 改为 “prototype” 多例。

    2、在Bean对象中避免定义可变的成员变量,当然,这样做不太现实,就当我没说。

    3、在类中定义 ThreadLocal 的成员变量,并将需要的可变成员变量保存在 ThreadLocal 中,ThreadLocal 本身就具备线程隔离

    的特性,这就相当于为每个线程提供了一个独立的变量副本,每个线程只需要操作自己的线程副本变量,从而解决线程安全问题。

    引用评论-

  • 相关阅读:
    【Python 千题 —— 基础篇】输出可以被5整除的数
    [MAUI]集成高德地图组件至.NET MAUI Blazor项目
    day24-服务器端渲染技术02
    Rocket快速实战与高级原理详解
    一种多源信息融合方法及其应用(Matlab代码实现)
    边缘运算6大应用介绍
    5.(vue3.x+vite)封装组件
    密码管理工具-KeePass入门指南
    SSL证书错误怎么办?浏览器常见SSL证书报错解决办法
    RAID知识点总结
  • 原文地址:https://blog.csdn.net/studyday1/article/details/136626922