單例
發現博客園可以很好的設置自己的博客文章的展示,很開心,然后特此發一篇
其實這幾種寫法大家應該都會的,就權當拿來記錄一下吧,以后復習鞏固也比較方便。
這篇文章中的代碼,來自一篇視頻(我想找視頻貼上,但我沒找到,以后有機會看到再貼吧,實不好意思),上面有講到,我覺得很好,擇錄了一些下來。
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.
//雙重驗證 //面試多考,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; } }
