前言
单例模式(Singleton Pattern)是 单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
懒汉式—线程不安全
//懒汉式单例模式(线程不安全)
class SingletonB{
// 类加载阶段,仅声明单例对象
private static SingletonB sg;
//1.构造方法的私有化
private SingletonB() { }
//2.创建"类本身"对象的方法
public static SingletonB getInstance() {
// 判断单例对象是否为空
if(sg == null) {
// 如果为空,则创建该单例对象
sg = new SingletonB();
}
return sg;
}
}
特点:
这种方式是最基本的实现方式,但因为加锁 synchronized,不支持多线程,所以严格意义上它并不算单例模式。
懒汉式—线程安全
//懒汉式单例模式(线程安全)
class SingletonB{
// 类加载阶段,仅声明单例对象
private static SingletonB sg;
//1.构造方法的私有化
private SingletonB() { }
//2.创建"类本身"对象的方法(使用synchronized加锁)
public static synchronized SingletonB getInstance() {
// 判断单例对象是否为空
if(sg == null) {
// 如果为空,则创建该单例对象
sg = new SingletonB();
}
return sg;
}
}
特点:
加上synchronize之类,保证线程安全的基础上的懒汉模式,但是相对性能很低,大部分时间并不需要同步。
饿汉式
// 饿汉式单例模式
class SingletonA{
// 类加载阶段,完成当前单例对象的创建
private static SingletonA sg = new SingletonA();
//1.构造方法的私有化
private SingletonA() { }
//2.创建"类本身"对象的方法
public static SingletonA instance() {
// 返回单例对象
return sg;
}
}
特点:
它基于 classloader 机制避免了多线程的同步问题,但是在类装载时就实例化,会导致内存浪费。
小结
一般情况下,尽量不要使用前两种实现,建议使用第 3 种饿汉式实现。