背景
工作也有四年了,基础的东西许久不看有些遗忘。一起来复习一下吧
单例模式
- 1.什么是单例模式?
顾名思义,只有一例,也就是一个对象只有一个实例。Spring中默认就是单例设计。比如我们常用的service和dao层的对象通常都是单例的。
也可以理解为,单例就是所有请求都交给一个对象处理。 - 2.单例有什么优缺点?为什么spring默认是单例不是多例?
因为没必要每个请求都新建一个对象,这样子既浪费CPU又浪费内存。
这也是为什么我们的service都是单例注入,很少看到多例注入。也是因为单例减少开销。并且service和dao中,涉及到多线程修改属性很少。
优点:①减少新生成实例的消耗。新生成实例包括两个方面,第一,spring会通过反射或者cglib来生成bean实例,这都是耗性能的操作。第二,给对象分配内存也会涉及负责算法。
②减少jvm垃圾回收。由于不会给每个请求都生成bean实例,所以回收的对象就少了。
③可以快速获取到bean。因为单例获取bean操作,除了第一次生成之外,其余都是从缓存里获取的,所以很快。
缺点:线程不安全。由于所有请求都共享一个bean实例,那么如果这个bean是一个有状态的bean的话,在并发场景下就有可能出现问题。
【无状态即:类中没有实例变量,不会影响结果】
多例模式
- 1.什么是多例?
多个实例,有点像传统的new。 - 2.多例的优缺点?什么时候使用呢?
之所以用多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;
优点:解决有状态的对象线程不安全问题。
缺点:开销大,gc
总结
个人感觉学习知识,要知道他的优缺点。从而考虑在不同场景下的应用。不能死板硬套