第一種形式:懶漢式,也是常用的形式。
publicclassSingletonClass{
privatestaticSingletonClass?instance=null;
publicstaticsynchronizedSingletonClass?getInstance(){
if(instance==null){
instance=newSingletonClass();
}
returninstance;
}
privateSingletonClass(){
}
}
第二種形式:餓漢式
//對第一行static的一些解釋
//?java允許我們在一個類里面定義靜態類。比如內部類(nested?class)。
//把nested?class封閉起來的類叫外部類。
//在java中,我們不能用static修飾頂級類(top?level?class)。
//只有內部類可以為static。
publicclassSingleton{
//在自己內部定義自己的一個實例,只供內部調用
privatestaticfinal?Singleton?instance?=newSingleton();
privateSingleton(){
//do?something
}
//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問
publicstaticSingleton?getInstance(){
returninstance;
}
}
第三種形式: 雙重鎖的形式
publicclassSingleton{
privatestaticvolatileSingleton?instance=null;
privateSingleton(){
//do?something
}
publicstaticSingleton?getInstance(){
if(instance==null){
synchronized(SingletonClass.class){
if(instance==null){
instance=newSingleton();
}
}
}
returninstance;
}
}
//這個模式將同步內容下方到if內部,提高了執行的效率,不必每次獲取對象時都進行同步,只有第一次才同步,創建了以后就沒必要了。
//這種模式中雙重判斷加同步的方式,比第一個例子中的效率大大提升,因為如果單層if判斷,在服務器允許的情況下,
//假設有一百個線程,耗費的時間為100*(同步判斷時間+if判斷時間),而如果雙重if判斷,100的線程可以同時if判斷,理論消耗的時間只有一個if判斷的時間。
//所以如果面對高并發的情況,而且采用的是懶漢模式,最好的選擇就是雙重判斷加同步的方式。