發現博客園能夠很好的設置本身的博客文章的展現,很開心,而後特此發一篇java
其實這幾種寫法你們應該都會的,就權當拿來記錄一下吧,之後複習鞏固也比較方便。
這篇文章中的代碼,來自一篇視頻(我想找視頻貼上,但我沒找到,之後有機會看到再貼吧,實很差意思),上面有講到,我以爲很好,擇錄了一些下來。面試
1.安全
//懶人寫法|原始 //缺點:類加載的時候就初始化實例,會拖慢應用啓動速度 public class PlainOldSingleton { private static PlainOldSingleton INSTANCE = new PlainOldSingleton(); private PlainOldSingleton(){} public static PlainOldSingleton getInstance(){ return INSTANCE; } }
2.性能
//懶加載 //缺點:不是線程安全的,有可能線程A和線程B來同時訪問INSTANCE的話,會new出兩個實例,若是有多個線程的話,就會new出多個實例 public class LazyNotThreadSafe{ private static LazyNotThreadSafe INSTANCE; private LazyNotThreadSafe(){} public static LazyNotThreadSafe getInstance(){ if(INSTANCE == null){ INSTANCE = new LazyNotThreadSafe(); } return INSTANCE; } }
3.線程
//同步鎖 //缺點:每次獲取都會加鎖,會有必定的性能開銷 //優勢:線程安全 public class LazyThreadSafeSynchronized{ private static LazyThreadSafeSynchronized INSTANCE; private LazyThreadSafeSynchronized(){} public static synchronized LazyThreadSafeSynchronized getInstance(){ if(INSTANCE == null){ INSTANCE = new LazyThreadSafeSynchronized(); } return INSTANCE; } }
4.code
//雙重驗證 //面試多考,volatile是java1.5以後的一個內容,要理解這個須要懂Java虛擬機 public class LazyThreadSafeDoubleCheck{ private static voltatile LazyThreadSafeDoubleCheck INSTANCE; private LazyThreadSafeDoubleCheck(){} public static LazyThreadSafeDoubleCheck getInstance(){ if(INSTANCE == null){ synchronized (LazyThreadSafeDoubleCheck.class){ if(INSTANCE == null){ INSTANCE = new LazyThreadSafeDoubleCheck(); } } } return INSTANCE; } }
5.視頻
//靜態內部類 //優雅,實現了懶加載和線程安全,線程安全利用了虛擬機的機制 public class LazyThreadSafeStaticInnerClass{ private static class Holder{ private static LazyThreadSafeStaticInnerClass INSTANCE == new LazyThreadSafeStaticInnerClass(); } private LazyThreadSafeStaticInnerClass(){} public static LazyThreadSafeStaticInnerClass getInstance(){ return Holder.INSTANCE; } }