(七)单例模式

2019-08-05  本文已影响0人  feiry

顾名思义,就是只能有一个实例,单例模式的运用场景非常多,有多种创建方法

饿汉式

public class Singleton {
    
    private Singleton() {
    }
    
    private static final Singleton singleton = new Singleton();

    public static Singleton getInstance() {
        return singleton;
    }
}

利用类加载机制,再加载类的时候就初始化好了实例,调用方法直接获取即可
特点:
1.线程安全
2.在加载类时初始化

懒汉式

其他懒汉式写法不讨论,直接使用正确的懒汉式写法

class Singleton2 {

    private Singleton2() {
    }

    private static volatile Singleton2 singleton;

    public static Singleton2 getInstance() {
        if (null == singleton) {//1.
            synchronized (Singleton2.class) {
                if (null == singleton) {//2.
                    singleton = new Singleton2();
                }
            }
        }
        return singleton;
    }
}

使用双检索+volatile 来保证线程安全、效率和懒加载问题

静态内部类

class Singleton3 {

    private Singleton3() {
    }

    public static Singleton3 getInstance() {
        return SingletonHolder.singleton;
    }

    private static class SingletonHolder{
        private static final Singleton3 singleton = new Singleton3(); 
    }
}

同样例如类加载器的机制,只有当时用getInstance方法时,才会实例化变量,和饿汉式比,同样没有使用synchronized,但是多一个懒加载的效果

枚举

enum  EnumSingleton {
    INSTANCE;
    public EnumSingleton getInstance(){
        return INSTANCE;
    }
}

大牛推荐的单例模式实现方式,代码简单,并且使用反射和序列化后的对象依然是同一个内存地址,上面的实现方式都不能避免反射攻击,但是没什么人用
企业中用java开发基本没有不用spring框架的,spring的IOC容器中默认就是单例的,使用spring就行

上一篇下一篇

猜你喜欢

热点阅读