单例模式(Singleton):

定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

class Singleton {
    // 私有静态常量,类加载时就实例化唯一的 HungrySingleton 对象
    private static final Singleton instance = new Singleton();

    // 私有构造函数,防止外部创建新的实例
    private Singleton() {}

    // 公共静态方法,提供全局访问唯一实例
    public static Singleton getInstance() {
        return instance; // 返回唯一的实例
    }
}

public class Singleton {
    // 私有静态变量,用于存储 Singleton 类的唯一实例
    private static Singleton instance;

    // 私有构造函数,防止外部类直接创建实例
    private Singleton (){}

    // 公共静态同步方法,用于获取 Singleton 实例
    public static synchronized Singleton getInstance() {
        // 如果实例为 null,说明尚未创建实例
        if (instance == null) {
            // 创建新的 Singleton 实例
            instance = new Singleton();
        }
        // 返回已存在或刚创建的唯一实例
        return instance;
    }  
}

注:synchronized关键字用于多线程编程。主要作用为:确保在多线程环境中,同一时间只有一个线程可以被synchronized修饰的方法或者代码块执行。类似同步互斥。

// 定义一个公共类 Singleton
public class Singleton {
    // 使用 volatile 关键字修饰的私有静态变量 singleton,确保在多线程环境下的可见性
    private volatile static Singleton singleton;

    // 私有构造函数,防止外部直接实例化该类
    private Singleton (){}

    // 公共静态方法,用于获取 Singleton 实例
    public static Singleton getSingleton() {
        // 首先检查 singleton 是否为 null
        if (singleton == null) {
            // 如果为 null,则进入同步块进行加锁
            synchronized (Singleton.class) {
                // 再次检查 singleton 是否为 null
                if (singleton == null) {
                    // 如果仍然为 null,则创建实例
                    singleton = new Singleton();
                }
            }
        }
        // 返回唯一实例 singleton
        return singleton;
    }
}

注:volatile 关键字表示这个变量可能会被多个线程同时访问,确保对该变量的读取和写入不会被缓存,而是直接从主内存中获取。

菜鸟想法:单例模式就像是整个世界只有一个宝贝东西,大家都要用这个东西,但是不能有第二个。实现单例模式一般有如下几个步骤:

  1. 构造方法私有化(private):防止其他代码直接创建该类的实例,只能通过指定的方法来获取实例
  2. 静态变量:用来存储唯一实例
  3. 公共方法:提供一个获得实例的公共方法,确保第一次调用时创建实例,之后的调用返回已经创建的实例

而饿汉式单例就是在创建静态变量(静态初始化)的时候就将自己实例化,如:private static Singleton instance = new Singleton();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值