软件开发的家园,编程爱好者的天地.

现在是:北京时间 2016/4/14 上午11:50:51 星期四

设为首页  |  加入收藏  |  网站地图

当前位置: 第八基地首页 > java > j2ee >
设计模式之单例模式(java版)
发布于:第八基地 来源:互联网 作者:天堂路上 时间:2017-10-16 点击:245

单例模式,顾名思义就是只有一个实例,就是类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%
对我没帮助
(0)
0%
返回顶部
在线反馈
在线反馈