《一天一模式》— 单例模式

1、单例模式的概念

所谓单例,就是整个程序有且仅有一个实例。该类负责建立本身的对象,同时确保只有一个对象被建立。 java

2、何时使用单例模式

单例模式是设计模式里使用的最多的一种模式之一,只要你想让对象在程序中有且只有一份,就能够使用单例模式。设计模式

3、怎么使用单例模式

单例模式使用场景多,可是写法却比较考究,据我所知就有五种写法。安全

3.1 懒汉式

// 饿汉模式
// 线程不安全,多线程下可能会出现多个instance对象
public class Singleton1 {

    private static Singleton1 instance;

    private Singleton1() {
    }

    public static Singleton1 getInstance() {
        if (instance == null) {
            instance = new Singleton1();
        }
        return instance;
    }

}

3.2 饿汉式

// 饿汉式
// 无论是否有用到,都会在程序启动时创建对象,若是对象比较大则会浪费空间。
public class Singleton2 {

    private static Singleton2 instance = new Singleton2();

    private Singleton2() {
    }

    public static Singleton2 getInstance() {
        return instance;
    }

}

3.3 双检锁

// 双检索
// 解决了懒汉式和饿汉式的缺陷
// 写法繁琐些
public class Singleton3 {

    private volatile static Singleton3 instance;

    public Singleton3() {
    }

    public static Singleton3 getInstance() {
        if (instance == null) {
            synchronized (Singleton3.class) {
                if (instance == null) {
                    instance = new Singleton3();
                }
            }
        }
        return instance;
    }

}

3.4 静态内部类式

// 静态内部类式
// 这样不使用这个内部类SingletonHolder
// 那么jvm虚拟机他就不会去加载这个类
public class Singleton4 {

    private static class SingletonHolder {
        private static final Singleton4 INSTANCE = new Singleton4();
    }

    private Singleton4() {
    }

    public static Singleton4 getInstance() {
        return SingletonHolder.INSTANCE;
    }

}

3.5 枚举式

// 枚举式
// 比较推荐的写法,能够应对屡次序列化和反射攻击
public enum Singleton5 {

    INSTANCE;

    public static Singleton5 getInstance() {
        return INSTANCE;
    }

}

4、总结

 单例模式定义和使用场景很简单,就是为了保证内存中只有一个对象。下面总结了单例的几种写法的优缺点:多线程

序号 名称 优势 缺点
1 懒汉式 简单 线程不安全,存在反序列化攻击和反射攻击
2 饿汉式 简单 没有延迟加载,有可能浪费空间,存在反序列化攻击和反射攻击
3 双检索式 线程安全 写法复杂,存在反序列化攻击和反射攻击
4 静态内部类式 比双检索简单 存在反序列化攻击和反射攻击
5 枚举式 简单、线程安全、能够防止反序列化攻击和反射攻击 /

以上就是我对单例模式的一些理解,有不足之处请你们指出,谢谢。jvm

相关文章
相关标签/搜索