Spring框架中的Bean是线程安全的么?如果线程不安全,那么如何处理?

Spring框架中的Bean是线程安全的么?如果线程不安全,那么如何处理?





Spring框架中的Bean是线程安全的么?如果线程不安全,那么如何处理?

  1. 对于prototype作用域的Bean,每次都创建一个新对象,也就是线程之间不存在Bean共享,因此不会有线程安全问题。
  2. 对于singleton作用域的Bean,所有的线程都共享一个单例实例的Bean,因此是存在线程安全问题的。但是如果单例Bean是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Controller类、Service类和Dao等,这些Bean大多是无状态的,只关注于方法本身。
    无状态Bean(Stateless Bean):就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。
    有状态Bean(Stateful Bean) :就是有实例变量的对象,可以保存数据,是非线程安全的。


# 单例bean有状态,采用ThreadLocal解决线程安全问题
ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。而ThreadLocal采用了“空间换时间”的方式。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。



<br><br><br><br>
<a href="https://github.com/Jmwang-Code">我的Github地址</a>,欢迎大家加入我的开源项目,或者(在我的主页联系我)加入你们的开源项目,点点Github-Stars。
| \   | 开源项目名称                                                                             | 依赖类型 | 版本号            | 描述                                                            |
|-----|------------------------------------------------------------------------------------|------|----------------|-----------|
| 1   | [spring-boot-starter-trie](https://github.com/Jmwang-Code/spring-boot-starter-trie) | pom  | 1.0.0-SNAPSHOT | 特定需求下查询速度远超开源检索工具,innodb下B+树或者ES中倒排索引无法与之比拟.                       |
| 2   | [spring-boot-starter-trie](https://github.com/Jmwang-Code/spring-boot-trie-service) | jar  | 1.0.0-M1       | 提供了基于SpringCloud的服务节点,可以通过Nacos注册中心进行服务发现,实现了树的动态扩容与缩容,以及服务的动态上下线。 |
| 3   | [Data-Provider](https://github.com/Jmwang-Code/Data-Provider) | pom  | 1.0.0-SNAPSHOT | 提供了多种数据源的查询,以及数据的类型同步,作为一个Jar可以依赖在其他服务上动态的提供数据。               |











猜你喜欢

转载自blog.csdn.net/jj89929665/article/details/130876048