设计模式-单例模式的八种实现方式

在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就 防止其它对象对自己的实例化,确保所有的对象都访问一个实例。

一、饿汉式静态常量

public class Singleton {

    //私有构造方法
    private Singleton(){

    }
    private final static Singleton instance=new Singleton();

    public static Singleton GetInstance(){

        return instance;
    }
}

特点:线程安全,但是可能造成内存浪费。

二、饿汉式静态代码块

public class Singleton {

    //私有构造方法
    private Singleton(){
    }
    private  static Singleton instance=null;
   //在静态代码块中,创建对象
    static {
        instance=new Singleton();
    }
    public static Singleton GetInstance(){
        return instance;
    }
}

特点:线程安全,但是可能造成内存浪费。

三、懒汉式-线程不安全

public class Singleton {

    //私有构造方法
    private Singleton(){
    }
    private  static Singleton instance;

    public static Singleton GetInstance(){
        if(instance == null){
            instance=new Singleton();
        }
        return instance;
    }
}

特点:实现懒加载,但是线程不安全。

四、懒汉式-线程安全

    //私有构造方法
    private Singleton(){
    }
    private  static Singleton instance;
   //使用synchronized
    public static synchronized  Singleton GetInstance(){
        if(instance == null){
            instance=new Singleton();
        }
        return instance;
    }
}

特点:线程安全,但是效率太低。

五、懒汉式-线程安全,同步代码块

public class Singleton {
    //私有构造方法
    private Singleton(){
    }
    private  static Singleton instance;
    public static   Singleton GetInstance(){
        if(instance == null){
            synchronized (Singleton.class){
                instance=new Singleton();
            }
        }
        return instance;
    }
}

特点:并不能起到线程安全的作用

六、双重检查

public class Singleton {
    //私有构造方法
    private Singleton(){
    }
    private  static Singleton instance;

    public static   Singleton GetInstance(){
        if(instance == null){
            synchronized (Singleton.class){
		//保证单例
                if(instance == null){
                    instance=new Singleton();
                }
            }
        }
        return instance;
    }
}

特点:延迟加载,效率较高。

七、静态内部类模式(推荐使用)

public class Singleton {
    //私有构造方法
    private Singleton(){
    }
    public static  class SingletonInstance{
        private static final  Singleton singleton=new Singleton();

    }
    public static   Singleton GetInstance(){
        return SingletonInstance.singleton;
    }
}

特点:实现懒加载,线程安全,采用类加载机制,实现线程安全和但实例。

八、枚举模式

public enum SingletonsIngleton {

    INSTANCE;
    private Singleton instance;

    SingletonsIngleton() {
        this.instance = new Singleton();
    }

    public Singleton getInstance() {
        return this.instance;
    }
    class Singleton{

    }
}

特点:不仅能避免多线程同步问题,而且还能避免反序列化重新创建新对象。