单例模式的正确打开方式

单例模式

1. 饿汉式单例类

public class EagerSingleton {

    private static EagerSingleton instance = new EagerSingleton();

    /**

     * 私有默认构造子

     */

    private EagerSingleton(){}

    /**

     * 静态工厂方法

     */

    public static EagerSingleton getInstance(){

        return instance;

    }

}

 

  1. 懒汉式

public class LazySingleton {

    private static LazySingleton instance = null;

    /**

     * 私有默认构造子

     */

    private LazySingleton(){}

    /**

     * 静态工厂方法

     */

    public static synchronized LazySingleton getInstance(){

        if(instance == null){

            instance = new LazySingleton();

        }

        return instance;

    }

}

 

  1. 线程安全单例

public class Singleton {

    private volatile static Singleton instance = null;

    private Singleton(){}

    public static Singleton getInstance(){

        //先检查实例是否存在,如果不存在才进入下面的同步块

        if(instance == null){

            //同步块,线程安全的创建实例

            synchronized (Singleton.class) {

                //再次检查实例是否存在,如果不存在才真正的创建实例

                if(instance == null){

                    instance = new Singleton();

                }

            }

        }

        return instance;

    }

}

 

  1. 同时实现延迟加载和线程安全的单例模式

public class Singleton {

    

    private Singleton(){}

    /**

     *    类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例

     *    没有绑定关系,而且只有被调用到时才会装载,从而实现了延迟加载。

     */

    private static class SingletonHolder{

        /**

         * 静态初始化器,由JVM来保证线程安全

         */

        private static Singleton instance = new Singleton();

    }

    

    public static Singleton getInstance(){

        return SingletonHolder.instance;

    }

}

 

  1. 最佳方法

public enum Singleton {

    /**

     * 定义一个枚举的元素,它就代表了Singleton的一个实例。

     */

    uniqueInstance;

    /**

     * 单例可以有自己的操作

     */

    public void singletonOperation(){

        //功能处理

    }

}

 

posted @ 2017-09-19 20:29  别动我代码  阅读(176)  评论(0)    收藏  举报