單例模式是比較容易在面試中出現的問題,一般要求是手寫代碼,比如我就試過了。。所以一定要打起十二分精神,要了解線程安全的、效率高的單例模式怎麼實現。下面是幾個代碼,分別是從不好的到好的逐漸遞進,這樣才能靈活面對面試官的下一步發問。好了,話不多說,直接上代碼:
實現一:
public class Singletop1 {
/*
* SingleTop的解法1:
* 推薦指數:***
* 原因:只支持單線程環境
* */
private static Singletop1 instance = null;
public static Singletop1 getSingletop1(){
if (instance == null) {
instance = new Singletop1();
}
//打印測試用例,可刪除
System.out.println(instance.hashCode());
return instance;
}
}
實現二:
public class SingleTop2 {
/*
* SingleTop的解法2:
* 推薦指數:***
* 原因:雖然在多線程環境中可以實現,但效率不高
* */
private static SingleTop2 instance2 = null;
public static synchronized SingleTop2 getSingleTop2(){
if (instance2 == null) {
instance2 = new SingleTop2();
}
//打印測試用例,可刪除
System.out.println(instance2.hashCode());
return instance2;
}
}
實現三:
public class SingleTop3 {
/*
* SingleTop的解法3:
* 推薦指數:****
* 原因:適合多線程,效率可行,但結構複雜,不易理解
* */
private static Object synObject = new Object();
private static SingleTop3 instance3 = null;
public static SingleTop3 getSingleTop3(){
if (instance3 == null) {
synchronized (synObject) {
if (instance3 == null) {
instance3 = new SingleTop3();
}
}
}
//打印測試用例,可刪除
System.out.println(instance3.hashCode());
return instance3;
}
}
實現四:
public class SingleTop4 {
/*
* SingleTop的解法4:
* 推薦指數:****
* 原因:線程安全,簡潔,但效率同樣較低,調用靜態構造函數的時機不由程序員掌控
* */
private static final SingleTop4 instance4 = new SingleTop4();
public static SingleTop4 getSingleTop4(){
//打印測試用例,可刪除
System.out.println(instance4.hashCode());
return instance4;
}
}
實現五:
public class SingleTop5 {
/*
* SingleTop的解法5:
* 推薦指數:*****
* 原因:利用嵌套類型的特性,做到只有在真正需要的時候才創建實例,既線程安全,又節省資源
* */
public static SingleTop5 getSingleTop5(){
//打印測試用例,可刪除
System.out.println(Nested.instance5.hashCode());
return Nested.instance5;
}
private static class Nested{
private static SingleTop5 instance5 = new SingleTop5();
}
}
如果你認真看了一遍以上五種實現方式,是否發現他們都是爲了解決前面某種不足而被開發出來的呢?這就是一種遞進性的理解。如果你從第一個實現方式開始看起,知道第五個實現方式也掌握了的話,那你對單例模式的理解也就到火候了。當然,實現單例模式並不止這五種方法,還有其他的形式,比如利用枚舉也可以實現。因此,如果想要理解多一點的話,也可以上csdn找一下相關的博客,總不會讓你失望的。
好了,這期博客到此結束,再見:
如有疑問,歡迎下方評論指出,共同進步