单例模式(懒汉式)

package com.itmc.web;

/**
 * @Author: yhf
 * @Date: 2026/3/21 13:45
 *
 * 单例模式(懒汉式)-基础版
 */
public class LocalCourseInterface {

    // 1. 私有静态实例变量【懒加载: 实例变量localCourseInterface初始值为null,只有第一次调用getInstance()时才会创建实例,节省内存】
    private static LocalCourseInterface localCourseInterface;

    // 2. 私有化构造方法,禁止外部创建实例【单例模式的核心,确保外部类无法通过new关键字创建该类的实例,只能通过getInstance()方法获取唯一实例】
    private LocalCourseInterface() {}

    // 3. 获取实例的公共静态方法【synchronized线程安全:保证多线程环境下只有一个线程能进入方法创建实例,避免重复实例化】
    public static synchronized LocalCourseInterface getInstance() {
        if (localCourseInterface == null) {
            localCourseInterface = new LocalCourseInterface();
        }
        return localCourseInterface;
    }

    public String fun1() {
        return "fun1";
    }

    public String fun2() {
        return "fun2";
    }

    /*
        外部类调用此类方法方式:
        LocalCourseInterface instance = LocalCourseInterface.getInstance();
        String res = instance.fun1();
    */

}


package com.itmc.web;

/**
 * @Author: yhf
 * @Date: 2026/3/21 13:49
 *
 * 单例模式(懒汉式)-进阶版
 * 如果对性能要求较高,比如频繁调用 getInstance(),为避免每次调用都加锁,可使用双重检查锁(DCL)进行优化
 *
 * 单例模式的核心是私有化构造方法 + 提供静态方法获取唯一实例;
 * 基础懒汉式单例需加 synchronized 保证线程安全,进阶可使用双重检查锁(DCL)提升性能;
 * volatile 关键字用于解决 DCL 模式下的指令重排问题,确保实例初始化完整。
 */
public class LocalCourseInterfaceV2 {

    // 优化点2、volatile关键字防止DCL指令重排,保证实例初始化完成后才被读取
    private static volatile LocalCourseInterfaceV2 localCourseInterfaceV2;

    private LocalCourseInterfaceV2() {}

    // 优化点1、DCL双检锁避免每次调用都加锁
    public static LocalCourseInterfaceV2 getInstance() {
        // 第一次检查:未创建实例时才加锁,减少锁竞争
        if (localCourseInterfaceV2 == null) {
            synchronized (LocalCourseInterfaceV2.class) {
                // 第二次检查:防止多线程等待锁后重复创建
                if (localCourseInterfaceV2 == null) {
                    localCourseInterfaceV2 = new LocalCourseInterfaceV2();
                }
            }
        }
        return localCourseInterfaceV2;
    }

}

posted @ 2026-03-21 16:29  yub4by  阅读(17)  评论(0)    收藏  举报