//第一種形式:懶漢式,也是常用的形式。 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; } }
|