單例模式的正確打開方式

單例模式安全

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

        //功能處理

    }

}

相關文章
相關標籤/搜索