七種實現單例模式的線程中只有
第五種:Volatile+Double-Check
第六種:Holder
第七種:enum
只有上面這三種,高效且線程安全同時實現懶加載
1.餓漢式:可以保證多線程下的唯一實例,getInstance性能也比較高,無法懶加載
2.懶漢式:不能保證多線程下唯一性
3.懶漢式+同步方法:能保證唯一和懶加載,但是性能低下
4.Double-Check:(使用同步代碼塊,只有當實例爲null,才加鎖創建實例),能保證唯一和懶加載,也較高效,
但是在多線程的情況下可能拋出空指針異常(線程1得到鎖後創建instance實例,但是未創建conn和socket,線程2判斷instance不爲空,然後調用conn和socket方法,導致空指針異常)
5.5.Volatile+Double-check:double-check雖然設計巧妙,當時可能引起類變量實例化conn和socket發生在instance實例化後,而volatile關鍵字可以防止 JVM在運行是重排序,保證順序性
6.Holder方式:(靜態內部類裏面定義了靜態的實例),既保證了懶加載,又保證了instance只被初始化一次(很像"懶加載式的餓漢式")
7.枚舉方式:(在很多優秀的源代碼中,可以看到枚舉實現單例的聲影),枚舉不允許繼承,且是線程安全只能 實例化一次