單例模式必須只有一個實例,並且提供一個全局訪問方法。 解析經典單利模式實例: 1 package designPatterns; 2 3 public class Singleton { 4 5 //利用一個靜態變數來記錄類的唯一實例 6 7 private static Singleton uni ...
單例模式必須只有一個實例,並且提供一個全局訪問方法。
解析經典單利模式實例:
1 package designPatterns; 2 3 public class Singleton { 4 5 //利用一個靜態變數來記錄類的唯一實例 6 7 private static Singleton uniqueInstance; 8 9 //聲明私有構造器,只有本類可以調用該構造器 10 11 private Singleton(){} 12 13 //創建一個靜態的方法獲取實例對象 14 15 public static Singleton getSingletonObj(){ 16 17 if(uniqueInstance==null){ 18 19 uniqueInstance=new Singleton(); 20 21 } 22 23 return uniqueInstance; 24 25 } 26 27 }View Code
解決多線程同步問題:
-
添加線程同步synchronize
例如:每次都進行同步效率較低,適用於較少適用對象場合
package designPatterns.singleton;
public class Singleton {
//利用一個靜態變數來記錄類的唯一實例
private static Singleton uniqueInstance;
//聲明私有構造器,只有本類可以調用該構造器
private Singleton(){}
//創建一個靜態的方法獲取實例對象(synchronized多線程處理,保證只有一個實例)
public static synchronized Singleton getSingletonObj(){
if(uniqueInstance==null){
uniqueInstance=new Singleton();
}
return uniqueInstance;
}
}
2.創建急切單利模式:長時間占用記憶體(適用與頻繁適用對象場合)
public class Singleton {
//利用一個靜態變數來記錄類的唯一實例
private static Singleton uniqueInstance=new Singleton();;
//聲明私有構造器,只有本類可以調用該構造器
private Singleton(){}
//創建一個靜態的方法獲取實例對象(synchronized多線程處理,保證只有一個實例)
public static Singleton getSingletonObj(){
return uniqueInstance;
}
}
3.雙重檢查加鎖:
例如:只有第一次創建對象的時候才進行同步(volatile只用於JDK4.0以上版本)
public class Singleton {
//利用一個靜態變數來記錄類的唯一實例
private static volatile Singleton uniqueInstance ;
//聲明私有構造器,只有本類可以調用該構造器
private Singleton(){}
//創建一個靜態的方法獲取實例對象(synchronized多線程處理,保證只有一個實例)
public static Singleton getSingletonObj(){
if(uniqueInstance==null){
synchronized(Singleton.class){
uniqueInstance=new Singleton();
}
}
return uniqueInstance;
}
}