單例模式--餓漢(按需建立)、懶漢(多執行緒以及多執行緒下改進)
阿新 • • 發佈:2018-12-24
程式碼註釋有介紹,(排版過於難受,下次用md排完再傳上來)
package singleton; /** * @author: ycz * @date: 2018/12/24 0024 22:15 * @description: 懶漢模式 */ public class SingleTon1 { public SingleTon1(){} private static SingleTon1 instance1 = null; public static SingleTon1 getInstance1(){ if (instance1==null){ instance1= new SingleTon1(); } return instance1; } }
package singleton; /** * @author: ycz * @date: 2018/12/24 0024 22:21 * @description: 餓漢模式 */ public class SingleTon2 { private SingleTon2(){} private static final SingleTon2 instance2 = new SingleTon2(); public static SingleTon2 getInstance2(){return instance2; } }
package singleton; /** * @author: ycz * @date: 2018/12/24 0024 22:32 * @description: 解決多執行緒問題(在建立單例時加鎖) */ public class SingleTon3 { private SingleTon3(){} private static SingleTon3 instance3 = null; public static synchronized SingleTon3 getInstance3(){if (instance3 == null){ instance3 = new SingleTon3(); } return instance3; } }
package singleton; /** * @author: ycz * @date: 2018/12/24 0024 22:36 * @description: 在方法上加鎖效率低下;可以先判斷是否有建立過單例,如果沒有在加鎖建立 */ public class SingleTon4 { private SingleTon4(){} private static final Object myLocker = new Object(); private static SingleTon4 instance4 = null; public static SingleTon4 getInstance4(){ if (instance4 == null){ synchronized (myLocker){ instance4 = new SingleTon4(); } } return instance4; } }
SingleTon按需建立:解決餓漢式過早建立單例的問題;當需要建立式,再通過靜態內部類取建立。
package singleton; /** * @author: ycz * @date: 2018/12/24 0024 22:52 * @description: 解決SingleTon2;建立過早問題 */ public class SingleTon5 { SingleTon5() { } private static class Nested { private final static SingleTon5 INSTANCE5 = new SingleTon5(); } public static SingleTon5 getInstance(){ return Nested.INSTANCE5; } }
這是SingleTon1(懶漢式)時會出現的問題。