天天看點

java中單例模式_Java中單例模式的幾種實作

餓漢式單例

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();

}

}