單例非常簡單,只說下一些值得注意的地方。
模式一:懶漢式
需要的時候在初始化,時間換空間,每次獲取實例都去判斷是否需要創建實例.非線程安全。
package com.kris.study;
public class Singleton {
private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
模式二:餓漢式
開始就初始化,空間換時間.線程安全,在裝載類時初始化,不會產生併發,因爲虛擬機保證只會裝載一次.
package com.kris.study;
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
如何實現線程安全的懶漢模式:
package com.kris.study;
public class Singleton {
private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance(){
if(instance == null){
synchronized (Singleton.class) {
if(instance == null)
instance = new Singleton();
}
}
return instance;
}
}
以上是標準的單例實現
高手的單例解決方案:
package com.kris.study;
public class Singleton {
private static class SingletonHolder{
private static Singleton instance = new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
類在裝載並被初始化的時候,會初始化他的靜態域,從而創建Singleton實例,由於是靜態域,因此在裝載時才初始化一次.
並由虛擬機來保證線程安全。而且getInstance方法沒有被同步.因此不會增加額外的成本.
單例和枚舉:
Effective JAVA中提倡用枚舉實現單例
package com.kris.study;
public enum Singleton {
INSTANCE;
public void singletonOperation(){
//功能處理
}
}