單例模式

//第一種形式:懶漢式,也是常用的形式。

public class Singleton1 {

 

private static Singleton1 instance = null;

 

public static synchronized Singleton1 getInstance(){

        if(instance==null){

               instance=new Singleton1();

        }

        return instance;

    }

 

private Singleton1(){

    }

 

}

 

 

//對第一行static的一些解釋

//java允許我們在一個類裏面定義靜態類。比如內部類(nested class)。

//把nested class封閉起來的類叫外部類。

//在java中,我們不能用static修飾頂級類(top level class)。

//只有內部類可以爲static。

public class Singleton2 {

// 在自己內部定義自己的一個實例,只供內部調用

private static final Singleton2 instance = new Singleton2();

 

private Singleton2() {

// do something

}

 

// 這裏提供了一個供外部訪問本class的靜態方法,可以直接訪問

public static Singleton2 getInstance() {

return instance;

}

}

 

 

//這個模式將同步內容下方到if內部,提高了執行的效率,不必每次獲取對象時都進行同步,只有第一次才同步,創建了以後就沒必要了。

//這種模式中雙重判斷加同步的方式,比第一個例子中的效率大大提升,因爲如果單層if判斷,在服務器允許的情況下,

//假設有一百個線程,耗費的時間爲100*(同步判斷時間+if判斷時間),而如果雙重if判斷,100的線程可以同時if判斷,理論消耗的時間只有一個if判斷的時間。

//所以如果面對高併發的情況,而且採用的是懶漢模式,最好的選擇就是雙重判斷加同步的方式。

public class Singleton3 {

    private static volatile Singleton3 instance=null;

    private Singleton3(){

        //do something

    }

    public static  Singleton3 getInstance(){

        if(instance==null){

            synchronized(Singleton1.class){

                if(instance==null){

                    instance=new Singleton3();

                }

            }

        }

        return instance;

     }

}

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章