一、饿汉式

缺点:不能懒加载

// 不能懒加载
public class SingletonObject1 { private static final SingletonObject1 instance = new SingletonObject1(); private SingletonObject1(){ } public static SingletonObject1 getInstance(){ return instance; } }

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

二、懒汉式(线程不安全)

public class SingletonObject2 { private static SingletonObject2 instance = null; private SingletonObject2(){ } public static SingletonObject2 getInstance(){ // 线程不安全模式
        if (instance == null) instance = new SingletonObject2(); return SingletonObject2.instance; } }

 

三、懒汉式(线程安全,效率低)

public class SingletonObject3 { private static SingletonObject3 instance = null; private SingletonObject3(){ } // 串行执行,效率低下
    public static synchronized SingletonObject3 getInstance(){ if (instance == null) instance = new SingletonObject3(); return SingletonObject3.instance; } }

 

四、懒汉式(线程安全,效率高,但是有空指针异常)

public class SingletonObject4 { private static SingletonObject4 instance = null; private SingletonObject4(){ } // 双重检查机制,严格单例,解决了懒加载的问题,但是也带来了问题:空指针异常
    public static SingletonObject4 getInstance(){ if (instance == null){ synchronized (SingletonObject4.class){ if (instance == null) instance = new SingletonObject4(); } } return SingletonObject4.instance; } }

 

五、懒汉式(解决四的问题,禁止指令重排序,加volatile关键字)

public class SingletonObject5 { private static volatile SingletonObject5 instance = null; private SingletonObject5(){ } // 双重检查机制,严格单例,解决了懒加载的问题,但是也带来了问题:空指针异常
    public static SingletonObject5 getInstance(){ if (instance == null){ synchronized (SingletonObject5.class){ if (instance == null) instance = new SingletonObject5(); } } return SingletonObject5.instance; } }

 

六、内部静态类的更加优雅的方式

 

public class SingletonObject6 { private SingletonObject6(){ } private static class InstanceHolder{ private final static SingletonObject6 instance = new SingletonObject6(); } public static SingletonObject6 getInstance(){ return InstanceHolder.instance; } }

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄