public class SingletonDemo01 { /** * 加載時就把對象創建出來--餓漢式 * 類初始化時天然的是線程安全的 */ private static SingletonDemo01 instance=new SingletonDemo01(); private SingletonDemo01(){ } //方法沒有同步,調用效率高 public static SingletonDemo01 getInstance(){ return instance; } }
public class SingletonDemo02 { /** * 加載時就不把對象創建出來--懶漢式 * 類初始化時天然的是線程安全的 */ private static SingletonDemo02 instance; private SingletonDemo02(){ } //方法同步,並發效率低(如果不同步,並發量高的時候可能創建多個對象) public static synchronized SingletonDemo02 getInstance(){ if(instance==null){ instance=new SingletonDemo02(); } return instance; } }
public class SingletonDemo03 { private static SingletonDemo03 instance=null; private SingletonDemo03(){ } public static SingletonDemo03 getInstance(){ if(instance==null){ SingletonDemo03 ins; synchronized (SingletonDemo03.class) { ins=instance; if(ins==null){ synchronized (SingletonDemo03.class) { if(ins==null){ ins=new SingletonDemo03(); } } instance=ins; } } } return instance; } }
public class SingletonDemo04 { private SingletonDemo04(){ } //類加載的方式天然線程安全 private static class Singleton04ClassInStance{ //不存在同步問題,效率高 private static final SingletonDemo04 instance=new SingletonDemo04(); } //調用的時候才去加載,延遲加載實現 public static SingletonDemo04 getInstance(){ return Singleton04ClassInStance.instance; } }
public enum SingletonDemo05 { /** * 這個枚舉元素本身就是單例 */ INSTANCE; /** * 還可以添加自己需要的操作 */ public void singletonOpt(){ } }
--主要:
① 餓漢式:線程安全,調用效率高,不可以延遲加載
② 懶漢式:線程安全,調用效率不高,可以延遲加載
-- 其他:
③ 雙重鎖:JVM底層內部模型原因,偶爾會出問題,不建議使用
④ 靜態內部類:線程安全,調用效率高,可以延遲加載
⑤ 枚舉式:線程安全,調用效率高,不可延遲加載。並且可以天然的防止反射和反序列化漏洞。