单例模式总结

2018-11-16  本文已影响0人  jasonma1314

1.名词解释。

单例,顾名思义就是在整个程序中只有一个对象。所有能实现这一目的的方法都是单例模式。

2.具体实现

(1)构造方法私有,确保外部类中不能new对象。

(2)提供方法供外部调用。返回对象。

3.多种单例的实现及优缺点比较

(1)饿汉式实现。

public class Singleton {

//静态成员变量 程序加载时就会创建对象

private static Singleton mInstance=new Singleton();

//构造方法私有

private Singleton(){

}

//公开方法,供外部调用获取对象

public static Singleton getInstance() {

return mInstance;

  }

}

缺点:程序加载就创建对象,会增加不必要的内存开销。

(2)懒汉式实现。

public class Singleton {

//静态成员变量

    private static Singleton mInstance;

    //构造方法私有

    private Singleton(){

}

//公开方法,返回对象

    public static Singleton getInstance() {

if(mInstance==null){

mInstance=new Singleton();

        }

return mInstance;

    }

}

与饿汉式差异:将创建对象操作移到公开方法中,判断对象为空则创建,不为空直接返回。

缺点:多线程操作时,不能确保单例。

(3)同步方法实现

public class Singleton {

//静态成员变量

    private static SingletonmInstance;

    //构造方法私有

    private Singleton(){

}

//公开方法,返回对象,增加synchronized关键字,

public static synchronized Singleton getInstance() {

if(mInstance==null){

mInstance=new Singleton();

        }

return mInstance;

    }

}

缺点:效率不高。

(4)同步锁加双重检查

public class Singleton {

//静态成员变量

    private static SingletonmInstance;

    //构造方法私有

    private Singleton(){

}

//公开方法,返回对象

    public static  Singleton getInstance() {

if(mInstance==null){

synchronized (Singleton.class){

if(mInstance==null){

mInstance=new Singleton();

                }

}

}

return mInstance;

    }

}

(5)加volatile关键字 (完美单例)

作用:1.防止重排序。2.线程可见性。

public class Singleton {

//静态成员变量

    private static volatile Singleton mInstance;

    //构造方法私有

    private Singleton(){

}

//公开方法,返回对象

    public static  Singleton getInstance() {

if(mInstance==null){

synchronized (Singleton.class){

if(mInstance==null){

mInstance=new Singleton();

                }

}

}

return mInstance;

    }

}

上一篇 下一篇

猜你喜欢

热点阅读