单例模式的正确打开方式

单例模式安全

1. 饿汉式单例类

public class EagerSingleton {spa

    private static EagerSingleton instance = new EagerSingleton();线程

    /**get

     * 私有默认构造子同步

     */io

    private EagerSingleton(){}class

    /**方法

     * 静态工厂方法线程安全

     */static

    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(){

        //功能处理

    }

}

相关文章
相关标签/搜索