单例模式
1、分类
类型 | 实例生成大致步骤 | 优点 | 缺点 |
---|---|---|---|
饿汉式 | 在类加载时初始化实例,getInstance()方法不用同步 | 线程安全、调用效率高 | 但不能延时加载(可能造成资源浪费) |
懒汉式 | 在调用时初始化实例,getInstance()需同步且得判断实例是否为空 | 线程安全、延时加载 | 调用效率不高,并发效率低 |
双重锁校验 | 初始化实例时同步更细粒度化 | 由于JVM内存模型原因导致可能出现某些问题 | |
静态内部类式(懒汉式) | 定义单例类A、静态内部类B、内部类B的final变量instance并调用A类构造函数初始化。getInstance()方法返回instance变量。 | 线程安全、调用效率高、延时加载 | |
枚举单例 | 线程安全、调用效率高、可防止反射和反序列化 | 不能延时加载 |
2、如何选用
多线程环境下:懒汉式单例模式生成实例的时间 远大于 其他四种
不需要延时加载:枚举>饿汉式
需要延时加载:静态内部类>懒汉式