1. 程式人生 > >Java-單例模式的幾種寫法

Java-單例模式的幾種寫法

一,懶漢式

優點:執行緒安全

缺點:類載入時就初始化了,沒有實現懶載入。

public class SingleTonFirst { private static SingleTonFirst singleTonFirst = new SingleTonFirst(); private SingleTonFirst() { } public static SingleTonFirst getInstance() {return singleTonFirst; } }

二,餓漢式(執行緒不安全的形式)

優點:懶載入
缺點:執行緒不安全
public class SingleTonSecond {

    private static 
SingleTonSecond singleTonSecond; private SingleTonSecond() { } public static SingleTonSecond getInstance() { if (null == singleTonSecond) { singleTonSecond = new SingleTonSecond(); } return singleTonSecond; } }
三,懶漢式(執行緒安全之同步方法)
優點:執行緒安全,懶載入

    缺點:每次獲取單例都要鎖定整個方法,效能較差


public class SingleTonThird {

    private static SingleTonThird singleTonThird;

    private SingleTonThird(){

    }
    public synchronized static SingleTonThird getInstance(){
        if(null==singleTonThird){
            singleTonThird=new SingleTonThird();
        }
        return singleTonThird
; } }
四,懶漢式(執行緒安全之同步程式碼塊)------推薦

    優點:執行緒安全,只在第一次獲取單例時鎖定了單例物件。

推薦!!!!!!!!!
public class SingleTonFourth {

    private volatile static SingleTonFourth singleTonFourth;

    private SingleTonFourth(){

    }
    public static SingleTonFourth getInstance(){
        if(null==singleTonFourth){
            synchronized (singleTonFourth){
                if (null==singleTonFourth){
                    singleTonFourth=new SingleTonFourth();
                }
            }
        }
        return singleTonFourth;
    }
}
五,靜態內部類方式-----------推薦!!!!!!!!

    優點:執行緒安全,懶載入,效率高靜態內部類的凡是在單例類在被JVM載入到記憶體時並不會立即例項化,而是在第一次呼叫

的getInstance()方法時才會將SingleTonFifthInner類載入到記憶體,從而例項化SingleTonFifthInner的靜態屬性 
SINGLETON,才開始載入例項化SINGLETON。並且在例項化SINGLETON的時候,JVM幫助我們保證了執行緒的安全性。
public class SingleTonFifth {

    private SingleTonFifth() {

    }

    public static SingleTonFifth getInstance() {
        return SingleTonFifthInner.SINGLETON;
    }

    private static class SingleTonFifthInner {
        private static final SingleTonFifth SINGLETON = new SingleTonFifth();
    }

}
六,列舉型別實現單例模式
public class SingleTonSixth {

    private SingleTonSixth(){

    }

    public static SingleTonSixth getInstance(){
        return SingleTonEnum.ISNTANCE.getInstancee();
    }

    private static enum SingleTonEnum{
        ISNTANCE;

        private  SingleTonSixth singleTonSixth;

        private  SingleTonEnum(){
            singleTonSixth=new SingleTonSixth();
        }

        private  SingleTonSixth getInstancee(){
            return singleTonSixth;
        }

    }
}