1: 什么是单例模式
单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。

2: 单例模式的应用场景
- 需要生成唯一序列的环境
- 需要频繁实例化然后销毁的对象
- 创建对象时候耗时或者资源过多,但是又经常使用的对象
- 方便资源相互通信的环境
3: 单例模式的优缺点
优点
- 在内存中只有一个对象,节省内存空间
- 避免 频繁的创建销毁对象,可以提高性能
- 避免对共享资源的多重占用,简化访问
- 为整个系统提供一个全局访问点
缺点
- 不适用频繁变化的对象
- 如果实例化对象长时间不被利用,系统会认为该对象是垃圾,会被回收,导致对象丢失
- 没有接口,不能继承
4: 单例模式实现方式
1: 懒汉模式 线程不安全
是懒加载,实现比较容易
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
2: 懒汉式 线程安全
是懒加载,线程安全,优点:第一次调用才初始化,避免内存浪费。缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率 getInstance() 的性能对应用程序不是很关键(该方法使用不太频繁)
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3: 饿汉式 线程安全
不是懒加载,优点:没有加锁,执行效率会提高。缺点:类加载时就初始化,浪费内存。它基于 classloader 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
4: 双检锁/双重校验锁
是懒加载,线程安全。这种方式采用双锁机制,安全且在多线程情况下能保持高性能。getInstance() 的性能对应用程序很关键。
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
//加锁
synchronized (Singleton.class) {
//获得锁之后,进行二次判断
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
5: 静态内部类
是懒加载,线程安全,实现容易。这种方式能达到双检锁方式一样的功效,但实现更简单。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。
public class Singleton {
//静态内部类
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
好了,以上就是单例模式的所有内容,如有不足,请多多指教。谢谢大家阅读。
















