1. 程式人生 > >單例模式的7種寫法

單例模式的7種寫法

文章目錄


1. 懶漢模式,單例例項在第一次使用時進行建立,非執行緒安全

/**
 * @program: Singleton
 * @description: 懶漢模式,單例例項在第一次使用時進行建立,<b>非執行緒安全</b>
 * @author: Mr.superbeyone
 * @create: 2018-09-30 09:15
 **/
public class SingletonDemo1 {
    //私有構造方法
    private SingletonDemo1() {
    }

    //單例物件
    private static SingletonDemo1 instance =
null; //靜態工廠方法 public static SingletonDemo1 getInstance() { if (instance == null) { instance = new SingletonDemo1(); } return instance; } }

2. 餓漢模式,單例例項在類裝載時進行建立,執行緒安全

/**
 * @program: Singleton
 * @description: 餓漢模式,單例例項在類裝載時進行建立,<b>執行緒安全</b>
 * @author: Mr.superbeyone
 * @create: 2018-09-30 09:21
 **/
public class SingletonDemo2 { //私有構造方法 private SingletonDemo2() { } //單例物件 private static SingletonDemo2 instance = new SingletonDemo2(); //靜態的工廠方法 public static SingletonDemo2 getInstance() { return instance; } }

3. 懶漢模式,單例例項在第一次使用時進行建立,執行緒安全,不推薦使用

/**
 * @program: Singleton
 * @description: 懶漢模式,單例例項在第一次使用時進行建立,<b>執行緒安全,不推薦使用</b>
 * @author: Mr.superbeyone
 * @create: 2018-09-30 09:29
 **/
public class SingletonDemo3 {
    //私有構造方法
    private SingletonDemo3() {
    }

    //單例物件
    private static SingletonDemo3 instance = null;

    //靜態工廠方法
    public static synchronized SingletonDemo3 getInstance() {
        if (instance == null) {
            instance = new SingletonDemo3();
        }
        return instance;
    }
}

4. 懶漢模式,雙重同步鎖單例模式,單例例項在第一次使用時建立,非執行緒安全

/**
 * @program: Singleton
 * @description: 懶漢模式,雙重同步鎖單例模式,單例例項在第一次使用時建立,<b>非執行緒安全</b>
 * @author: Mr.superbeyone
 * @create: 2018-09-30 09:38
 **/
public class SingletonDemo4 {
    //私有構造方法
    private SingletonDemo4() {
    }

    //單例物件
    private static SingletonDemo4 instance = null;

    //靜態工廠方法
    public static SingletonDemo4 getInstance() {
        //雙重檢測機制
        if (instance == null) {
            //同步鎖
            synchronized (SingletonDemo4.class) {
                if (instance == null) {
                    instance = new SingletonDemo4();
                }
            }
        }
        return instance;
    }
}

5. 懶漢模式,雙重同步鎖單例模式,單例例項在第一次使用時建立,執行緒安全

/**
 * @program: Singleton
 * @description: 懶漢模式,雙重同步鎖單例模式,單例例項在第一次使用時建立,<b>執行緒安全</b>
 * @author: Mr.superbeyone
 * @create: 2018-09-30 09:45
 **/
public class SingletonDemo5 {

    //私有構造方法
    private SingletonDemo5() {
    }

    //單例物件 volatile + 雙重檢測機制 -> 禁止指令重排
    private volatile static SingletonDemo5 instance = null;

    //靜態工廠方法
    public static SingletonDemo5 getInstance() {
        //雙重檢測機制
        if (instance == null) {
            //同步鎖
            synchronized (SingletonDemo5.class) {
                if (instance == null) {
                    instance = new SingletonDemo5();
                }
            }
        }
        return instance;
    }
}

6. 餓漢模式,單例例項在類裝載時進行建立,執行緒安全

/**
 * @program: my-blog
 * @description: 餓漢模式,單例例項在類裝載時進行建立,<b>執行緒安全</b>
 * @author: Mr.superbeyone
 * @create: 2018-09-30 09:56
 **/
public class SingletonDemo6 {
    //私有構造方法
    private SingletonDemo6() {
    }

    //單例物件
    private static SingletonDemo6 instance = null;

    static {
        instance = new SingletonDemo6();
    }

    //靜態工廠方法
    public static SingletonDemo6 getInstance() {
        return instance;
    }
}

7. 列舉模式,執行緒安全,推薦使用

/**
 * @program: Singleton
 * @description: 列舉模式,<b>執行緒安全,推薦使用</b>
 * @author: Mr.superbeyone
 * @create: 2018-09-30 09:59
 **/
public class SingletonDemo7 {
    //私有構造方法
    private SingletonDemo7() {
    }

    public static SingletonDemo7 getInstance() {
        return Singleton.INSTANCE.getInstance();
    }

    private enum Singleton {
        INSTANCE;
        private SingletonDemo7 singleton;

        //JVM保證這個方法絕對只調用一次
        Singleton() {
            singleton = new SingletonDemo7();
        }

        private SingletonDemo7 getInstance() {
            return singleton;
        }
    }
}