Spring 框架中都用到了哪些设计模式、spring context、Spring框架中的单例bean是线程安全的吗、Spring如何处理线程并发问题?

1Spring 框架中都用到了哪些设计模式?

工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
单例模式:Bean默认为单例模式
代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
模板方法:用来解决代码重复的问题。比如.jdbcTemplate
观察者模式:定义对象键一种一对多的依赖关系当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener

2详细讲解一下核心容器(spring context应用上下文) 模块

在这里插入图片描述
在这里插入图片描述
context是基本的Spring模块,提供spring 框架的基础功能BeanFactory 是 任何以spring为基础的应用的核心。Spring 框架建立在context模块之上,它使Spring成为一个容器。

Bean 工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从真正的应用代码中分离。最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory它根据XML文件中的定义加载beansspring容器从XML 文件读取配置元数据并用xml文件去创建一个完全配置的系统或应用。

3Spring框架中的单例bean是线程安全的吗?

不是,Spring框架中的单例bean不是线程安全的。
spring 中的 bean 默认是单例模式spring 框架并没有对单例 bean 进行多线程的封装处理

实际上大部分时候 spring bean 无状态【不会保存数据】的(比如 dao 类),所有某种程度上来说 bean 也是安全的但如果 bean 有状态【有数据存储功能】的话(比如 view model 对象),那就要开发者自己去保证线程安全了,最简单的就是改变 bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。

4Spring如何处理线程并发问题?

在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。

ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题

同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。而ThreadLocal采用了“空间换时间”的方式

ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal

ThreadLocal的设计

原理:线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供ThreadLocal类来支持线程局部变量,是一种实现线程安全的方式

每个Thread维护一个ThreadLocalMap,这个Map的Key是ThreadLocal实例本身,value才是真正要存存储的值object。

1 每个Thread线程内部都有一个Map(ThreadLocalMap)
2 Map里存储Entry 【ThreadLocal对象(Key)和线程的变量副本(value)】
3 Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向Map获取和设置线程的变量值。
4 对于不同的线程,每次获取副本时,别的线程并不能获取到当前线程的副本值,形成了副本的隔离,互不干扰。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zs18753479279/article/details/115028443