问题
1. 什么是单例多例?
2.什么是饿汉模式?
3.什么是懒汉模式?
4. 为什么要用单例多例?5. 什么时候用单例,什么时候用多例?
1. 什么是单例、多例:
所谓单例就是所有的请求都用一个对象(实例)来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象(实例)来处理,比如action;
一、单例模式和多例模式说明:
1. 单例模式和多例模式属于对象模式。
2. 单例模式的对象在整个系统中只有一份,多例模式可以有多个实例。
3.它们都不对外提供构造方法,即构造方法都为私有。
2.什么是饿汉模式:(创建对象的时候调用)
很饥饿,你想想,当人很饥饿时候是不是就有什么吃什么,那就是这个道理,所以就已加载类就创建对象。就好像当刚建好一个房子。主人就 搬了进去也不等装修。
具体代码实现:
public class Singleton { /*饿汉模式*/ private static Singleton singleton; private Singleton(){} private Singleton getSingleton(){ return singleton; }}
3.什么是懒汉模式:
就好比刚才我给别人介绍了房子的各种好,客人终于动心了就想买,这时候房子主人才出来和客人进行下一步的沟通。
具体代码实现:
public class Singleton {
private static Singleton newInstance = null; private Singleton(){} public static Singleton getSingleton(){ if(newInstance == null){ newInstance = new Singleton(); } return newInstance; }}
在使用懒汉模式的时候,会引起安全问题:
public class Singleton {
/** * 加锁 * 一般来说大多数情况不加锁并没有任何问题, * 但是在多线程并发执行的时候就很容易出现安全隐患, * 第一个线程在判断newInstance==null时, * 还没有new出实例时, * 第二个线程也进来, * 判断的newInstance也是null, * 然后也会new出实例, * 这就不是我们想要的单例模式了, * 所以就需要加锁, * 使用synchronized关键字, * 加锁更能解决安全问题, * 但加锁同时也会出现一个问题, * 那就是每次都需要判断锁, * 这样性能就会降低, * 所以为了提高性能, * 我们应该尽量减少锁判断的次数, * 加上双重判断, * 推荐选择饿汉模式,直白点就是简单,安全。 */ private static Singleton newInstance = null; private Singleton(){} public static Singleton getNewInstance(){ if (newInstance == null){ synchronized (Singleton.class){ if (newInstance == null){ newInstance = new Singleton(); } } } return newInstance; } }
4. 为什么用单例、多例:
之所以用单例,是因为没必要每个请求都新建一个对象,这样子既浪费CPU又浪费内存;
之所以用多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;
5.用单例和多例的标准只有一个:
当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),则多例,否则单例;