设计模式之单例模式

来源:互联网 发布:文件夹自动拷贝软件 编辑:程序博客网 时间:2024/06/03 13:57

这么长时间了,才来系统的学习一下设计模式,有点惭愧~
废话不多说,上翠花!
单例模式,顾名思义就是只有一个实例,就是类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,而此时第一个用户还没有实例化好,那就会报错啦!

唉,那咋办呢?自己选择吧!

0 0