餓漢式單例
public class Single{
private static Single mInstance = new Single();
private Single(){}
public static Single getInstance(){
return mInstance;
}
}
優點是線程安全,缺點時沒有辦法實作懶加載。
懶漢式+同步方法單例
public class Single{
private static Signle mInstance;
private Single(){}
public static synchronized Single getInstance(){
if(mInstance == null){
mInstance = new Single();
}
return mInstance;
}
}
優點是線程安全,懶加載
缺點是效率不高
volatile+Double Check方式
public class Single{
private volatile static Single mInstance;
private Single(){}
private static Single getInstance(){
if(mInstance == null){
synchronized(Single.class){
if(mInstance == null){
mInstance = new Single();
}
}
}
return mInstance;
}
}
優點是線程安全,效率還可以
Holder模式
public class Single{
private Single(){}
private static class Holder{
private static Single instance = new Single();
}
public static Single getInstance(){
return Holder.instance;
}
}
優點是線程安全,懶加載,效率高。
枚舉方式
public enum Single{
//單例變量,也是枚舉變量
INSTANCE;
public static getInstance(){
return INSTANCE;
}
}
優點,線程安全
缺點,沒有懶加載
枚舉+Holder
public class Single{
private Single(){}
//這個枚舉類型的Holder主要是為了確定單例
private enum EnumHolder{
INSTANCE;
//單例的枚舉型中包含一個Single類型的變量
private Single instance;
EnumHolder(){
//在構造函數中延時初始化
this.instance = new Single();
}
//提供方法傳回單例
private Single getInstance(){
return instance;
}
}
//通過枚舉類型傳回單例執行個體
public static Single getInstance(){
return EnumHolder.INSTANCE.getInstance();
}
}