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;
}
}