所谓单例,就是整个程序有且仅有一个实例。该类负责建立本身的对象,同时确保只有一个对象被建立。 java
单例模式是设计模式里使用的最多的一种模式之一,只要你想让对象在程序中有且只有一份,就能够使用单例模式。设计模式
单例模式使用场景多,可是写法却比较考究,据我所知就有五种写法。安全
// 饿汉模式 // 线程不安全,多线程下可能会出现多个instance对象 public class Singleton1 { private static Singleton1 instance; private Singleton1() { } public static Singleton1 getInstance() { if (instance == null) { instance = new Singleton1(); } return instance; } }
// 饿汉式 // 无论是否有用到,都会在程序启动时创建对象,若是对象比较大则会浪费空间。 public class Singleton2 { private static Singleton2 instance = new Singleton2(); private Singleton2() { } public static Singleton2 getInstance() { return instance; } }
// 双检索 // 解决了懒汉式和饿汉式的缺陷 // 写法繁琐些 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; } }
// 静态内部类式 // 这样不使用这个内部类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; } }
// 枚举式 // 比较推荐的写法,能够应对屡次序列化和反射攻击 public enum Singleton5 { INSTANCE; public static Singleton5 getInstance() { return INSTANCE; } }
单例模式定义和使用场景很简单,就是为了保证内存中只有一个对象。下面总结了单例的几种写法的优缺点:多线程
序号 | 名称 | 优势 | 缺点 |
1 | 懒汉式 | 简单 | 线程不安全,存在反序列化攻击和反射攻击 |
2 | 饿汉式 | 简单 | 没有延迟加载,有可能浪费空间,存在反序列化攻击和反射攻击 |
3 | 双检索式 | 线程安全 | 写法复杂,存在反序列化攻击和反射攻击 |
4 | 静态内部类式 | 比双检索简单 | 存在反序列化攻击和反射攻击 |
5 | 枚举式 | 简单、线程安全、能够防止反序列化攻击和反射攻击 | / |
以上就是我对单例模式的一些理解,有不足之处请你们指出,谢谢。jvm