设计模式之单例模式

   这么长时间了,才来系统的学习一下设计模式,有点惭愧~
   废话不多说,上翠花!

单例模式,顾名思义就是只有一个实例,就是类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,而此时第一个用户还没有实例化好,那就会报错啦!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值