这么长时间了,才来系统的学习一下设计模式,有点惭愧~ 废话不多说,上翠花! 单例模式,顾名思义就是只有一个实例,就是类A只能new A()一次~ 正常的,我们不考虑这种模式,一般会给一个类new出好多实例,这种情况会影响系统性能,没什么必要。
单例模式分为:饿汉模式,懒汉模式
1,饿汉模式
/** * 饿汉模式很饿,一开始就给他喂饱 * 饿汉模式在类刚加载的时候就实例化 * 线程安全,因为都是新建的实例 */
public class Singleton1 { //静态变量 private static Singleton1 instance = new Singleton1(); //构造方法私有化,就可以让那些货不能直接new获得实例,必须这样~ private Singleton1() {} //拿实例的方法 public static Singleton1 getInstance(){ return instance; } }2,懒汉模式
/** * 懒汉模式就是很懒,所有每次人家跟他要东西才会给出东西,不提前干活 * 懒汉模式就是请求发出来,才开始加载,不会再类加载的时候加载 * 线程不安全,可能多个用户同时请求 */
public class Singleton2 { //静态变量 private static Singleton2 instance=null; //构造方法私有化,就可以让那些货不能直接new获得实例,必须这样~ private Singleton2() {} public static Singleton2 getInstance(){ if(instance==null){ instance = new Singleton2(); } return instance; } }如果不是多线程,这个方法显然也够用了,但是万一是多线程呢?那么我们来优化!
public class Singleton2 { //静态变量 private static Singleton2 instance=null; //构造方法私有化,就可以让那些货不能直接new获得实例,必须这样~ private Singleton2() {} public static synchronized Singleton2 getInstance(){ if(instance==null){ instance = new Singleton2(); } return instance; } }这样就好了,可是要是这样,拿用户多了,访问多了,那效率多低啊! 再优化:
public class Singleton2 { //静态变量 private static Singleton2 instance=null; //构造方法私有化,就可以让那些货不能直接new获得实例,必须这样~ private Singleton2() {} public static synchronized Singleton2 getInstance(){ if(instance==null){ //1 synchronized(Singleton2.class){ instance = new Singleton2(); //2 } } return instance; } }这样不是好了吗?深深的感觉不是~为啥?比如:当一个用户执行到代码2时,又来一个用户执行代码1,而此时第一个用户还没有实例化好,那就会报错啦!
唉,那咋办呢?自己选择吧!