單例模式

定義

??一個類至多有一個對象實(shí)例。這個實(shí)例被稱為單例。在使用時才初始化被稱為懶漢式單例,類一加載就初始化被叫做餓漢式單例。有8種常見實(shí)現(xiàn)方式。

實(shí)現(xiàn)

  1. 靜態(tài)常量法:可用
public class Singleton {
    private final static Singleton instance = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        return instance;
    }
}
  1. 靜態(tài)代碼塊:可用
public class Singleton {
    private static Singleton instance;
    static { instance = new Singleton(); }
    private Singleton() {}
    public Singleton getInstance() {
        return instance;
        }
}
  1. 靜態(tài)方法:不可用
public class Singleton {
    private static Singleton singleton;
    private Singleton() {}
    public static Singleton getInstance() {
        if (singleton == null) 
            singleton = new Singleton();
        return singleton;
    }
}

??線程A進(jìn)入第7句但還未來得及初始化時,線程B在第5句判斷為null,所以也可以進(jìn)入第6句,有并發(fā)問題。

  1. 同步方法:可用但不推薦
public class Singleton {
    private static Singleton singleton;
    private Singleton() {}
    public static synchronized Singleton getInstance() {
        if (singleton == null)
            singleton = new Singleton();
        return singleton;
    }
}
  1. 同步代碼塊:不可用
public class Singleton {
    private static Singleton singleton;
    private Singleton() {}
    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                singleton = new Singleton();
            }
        }
        return singleton;
    }
}

??線程A進(jìn)入第7句但還未來得及初始化時,線程B在第5句判斷為null,雖然得等到A初始化完成,但也可以進(jìn)入第7句,有并發(fā)問題。

  1. 雙重檢查:可用且推薦用
public class Singleton {
    private static volatile Singleton singleton;
    private Singleton() {}
    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}
  1. 靜態(tài)內(nèi)部類:可用且推薦用
public class Singleton {
    private Singleton() {}
    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}
  1. 枚舉:可用且推薦用
public enum Singleton {
    INSTANCE;
    public void whateverMethod() {
        doSomethingHere...
    }
}

原文來至https://www.cnblogs.com/zhaoyan001/p/6365064.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容