黑马程序员——单例设计模式

------- android培训java培训、期待与您交流! ----------

单例的作用:只能让内存中只有这一个类的存在,也就是说这个类只能有一个实例
设计的目的以及什么时候调用:优化内存,如果一个类它只有一个变量,那么它是以类存在的话,此时就可以设计成单例模式。
如何设计:

1,它不能被其他类给实例化了

2,它可以自己提供一个实例化方法

3,这个方法是静态的,要对外访问。


2种单例:
懒汉式,顾名思义,比较懒,当要用到的时候,再去加载它,不然就不给加载。
饿汉式:用到的时候就已经加载好了。

饿汉式代码:

class Singleton {
    //私有,静态的类自身实例
    privatestatic Singleton instance = new Singleton();
 
    //私有的构造子(构造器,构造函数,构造方法)
    privateSingleton() {
    }
 
    //公开,静态的工厂方法
    publicstatic Singleton getInstance() {
        returninstance;
    }
}


懒汉式代码:

class Single {
    //私有构造方法,不允许其他类创建对象
 
    privateSingle() {
    };
 
    privatestatic Single instance = null;
 
    //提供获取对象的方法
 
    publicstatic Single getInstance() {
 
        if(instance == null) { // 用到的时候再去加载它.
 
            instance= new Single();
 
        }
        returninstance;
    }
}



饿汉式变种

class Singleton {
 
    //私有,静态的类自身实例
 
    privatestatic Singleton instance = null;
    static{
 
        instance= new Singleton(); // 一出来就直接给它加载了,先把类给实例了
 
    }
 
    //私有的构造子(构造器,构造函数,构造方法)
 
    privateSingleton() {
    }
 
    //公开,静态的工厂方法
 
    publicstatic Singleton getInstance() {
 
        returninstance;// 然后就不管是不是被调用了,反正就是先被加载了
    }
}



懒汉式要注意的地方:

class Single {
    /*
     * 如果单例是被多条线程给执行了, 那么执行懒汉式的时候,就出现
     *
     * 两条线程同时执行了null的方法, 那么A线程执行等于null,实例化一个对象了,B再进来又被实例化了一条
     *
     * 这是不允许的,那么就要用到synchronized同步锁这个概念
     */
 
    privateSingle() {
    };
 
    privatestatic Single instance = null;
 
    //提供获取对象的方法
 
    publicstatic Single getInstance() {
 
        //提高判断锁的效率不让每次都判断
 
        //如果是synchronized在前面的话,每次都要判断锁,效率很低。
 
        if(instance == null)
 
            //多线程的同步操作,锁是自身的字节码
 
            synchronized(Single.class) {
 
                if(instance == null)
 
                    //自己创建对象
 
                    instance= new Single();
 
            }
 
        returninstance;
    }
}
 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值