本文共 1140 字,大约阅读时间需要 3 分钟。
在 面向对象 的程序设计中,单例模式是一种常用的设计模式. 它确保一个类在程序中只有一个实例,从而减少资源浪费,提高效率. 以下是单例模式的6种主要实现方式:
饿汉模式的特点是在类加载的时候就进行实例化. 这种方式在类加载过程中就已经预先创建了实例,虽然在首次获取对象时反应稍慢,但一次获取对象的速度会更快. 优点是无需额外的线程同步,避免了多线程环境下的同步问题. 缺点是在内存占用较大的情况下可能会有浪费资源.
懒汉模式的特点是在第一次调用 getInstance()
方法时才进行实例化. 这样可以在第一次实际需要对象的时候才进行初始化,省去了不必要的资源消耗. 优点是资源利用率高. 缺点是在多线程环境下存在竞态条件,可能导致线程安全问题.
为了解决多线程环境下的线程安全问题,懒汉模式可以使用线程同步机制. 通过在 getInstance()
方法外面加上 synchronized
关键字,可以保证单个线程在获取实例的同时,其他线程无法进行实例化操作. 这样可以保证单例对象的 thread-safety. 但是这种方式会导致每次获取单例对象都要进行同步,可能会影响性能.
双重检查模式结合了懒汉模式和线程安全机制. 它在 getInstance()
方法中使用两次 if
语句来检查单例对象是否存在. 第一次检查是在不带同步的代码块中进行的,进行了优化,避免了不必要的同步. 第二次检查是在同步的代码块中进行的,确保只有在单例对象不存在的情况下才会进行实例化. 这种方式在高并发环境下性能较好,资源利用率高. 不过,由于 volatile
关键字的使用可能会带来一些性能上的开销.
这种模式通过使用静态内部类来存储单例对象. 在第一次调用 getInstance()
方法时,外部类的加载机制会初始化静态内部类,并且只会初始化一次单例对象. 这样可以避免在高并发环境下的同步问题,同时确保单例对象的唯一性. 该模式的优点是既保证了懒 loading 的特性,又确保了 thread-safety.
枚举单例是一种非常简洁的实现方式. 通过在枚举类中定义一个唯一的单例 constant,确保了类内只有一个实例. 这种方式可以避免多线程同步的问题,同时还可以避免一些资源浪费. 但这种方式只能适用于枚举类型的单例对象.
单例模式的使用场景非常广泛,主要包括以下情况:
转载地址:http://gwvmz.baihongyu.com/