单例设计模式

本文详细介绍了Java中的单例设计模式,包括其概念、重要性和实现方式。单例模式确保一个类只有一个实例,提供了全局访问点。文章列举了六种实现单例的常见方法:直接实例化饿汉式、枚举式、静态代码块饿汉式、线程不安全的懒汉式、线程安全的懒汉式以及静态内部类形式,并提供了相应的代码示例。这些实现方式分别适用于不同的场景和线程需求。
摘要由CSDN通过智能技术生成

什么是 Singleton?

Singleton:在 Java 中即指单例设计模式,它是软件开发中最常用的设计模式之一

  • 单:唯一
  • 例:实例

单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。
例如:代表 JVM 运行环境的 Runtime

要点

  1. 某个类只能有一个实例
    实现方式:构造器私有化
  2. 必须自行创建这个实例
    实现方式:含有一个该类的静态变量来保存这个唯一的实例
  3. 必须自行向整个系统提供这个实例
    实现方法:对外提供获取该实例对象的方式
    • 直接暴露
    • 用静态变量的 get 方法获取

几种常见实现形式

饿汉式:直接创建对象,不存在线程安全问题

  1. 直接实例化饿汉式(简洁直观)
  2. 枚举式(最简洁)
  3. 静态代码块饿汉式(适合复杂实例化)

懒汉式:延迟创建对象

  1. 线程不安全(适合单线程)
  2. 线程安全(适合多线程)
  3. 静态内部类形式(适用于多线程)

下面分别实现上面六种方式:
1. 饿汉式:直接创建实例对象,不管你是否需要这个对象,都会创建

  • 构造器私有化
  • 自行创建,并用静态变量保存
  • 向外提供这个实例
  • 强调这个是单例,我们可以用final修改
public class Singleton {
    public static final Singleton INSTANCE = new Singleton();
    private Singleton() {}
}

2. 饿汉式:枚举式

  • 枚举类型表示该类型的对象是有限的几个
  • 我们可以限定为一个,就成了单例
  • 注意:枚举类型重写了 toString() 方法,因此打印这个对象,结果就是 INSTANCE,而不是变量地址
public enum Singleton {
    INSTANCE;
}

3. 饿汉式:静态代码块

public class Singleton {
    public static final Singleton INSTANCE;
    static {
        INSTANCE = new Singleton();
    }
    private Singleton() {}
}

4. 懒汉式:线程不安全

  1. 构造器私有化
  2. 用一个静态变量保存这个唯一实例
  3. 提供一个静态方法,获取这个实例
public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) instance = new Singleton();
        return instance;
    }
}

5. 懒汉式:线程安全

public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) instance = new Singleton();
            }
        }
        return instance;
    }
}

6. 静态内部类形式

  • 在内部类被加载和初始化时,才创建 INSTANCE 实例对象
  • 静态内部类不会自动随着外部类的加载和初始化而初始化,他是要单独去加载和初始化的
  • 因为是在内部类加载和初始化时创建,因此是线程安全的
public class Singleton {
    private Singleton() {}
    private static class Inner {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return Inner.INSTANCE;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值