【单例模式】

java 复制代码
public final class SingletonManager {

 private volatile static SingletonManager sSingletonManager;
 
 private SingletonManager(){
 }

 public static SingletonManager getInstance() {
        if (null == sSingletonManager) {
            synchronized (SingletonManager.class) {
                if (null == sSingletonManager) {
                    sSingletonManager = new SingletonManager();
                }
            }
        }
        return sSingletonManager;
    }
}

这段Java代码实现了一个单例模式,确保在整个应用程序中SingletonManager类只有一个实例,并提供了线程安全的访问方式。以下是关键点的解析:

  1. 类结构

    a、public final class SingletonManager

    final修饰符防止类被继承,保证单例的不可扩展性。

    b、private volatile static SingletonManager sSingletonManager

    volatile确保多线程环境下的可见性,并禁止指令重排序,避免未完全初始化的对象被其他线程访问。

  2. 私有构造方法

    构造方法私有化,阻止外部通过new创建实例,强制通过getInstance()获取单例。

java 复制代码
private SingletonManager() {}
  1. 双重检查锁定(Double-Checked Locking)

    a、第一次检查(无锁)

    快速判断实例是否已存在,避免不必要的同步开销。

    b、同步块

    锁定SingletonManager.class,确保同一时间只有一个线程进入临界区。

    c、第二次检查(有锁)

    防止多个线程通过第一次检查后,依次进入同步块重复创建实例。

java 复制代码
public static SingletonManager getInstance() {
    if (null == sSingletonManager) {                 // 第一次检查(无锁)
        synchronized (SingletonManager.class) {      // 加锁
            if (null == sSingletonManager) {         // 第二次检查(有锁)
                sSingletonManager = new SingletonManager();
            }
        }
    }
    return sSingletonManager;
}
  1. 线程安全性

    a、volatile的作用

    解决双重检查锁定中的指令重排序问题。在Java 5+中,volatile确保写操作(对象初始化)在读操作之前完成。

    b、延迟初始化(Lazy Initialization)

    实例在首次调用getInstance()时创建,避免类加载时立即初始化(饿汉式单例的资源浪费问题)。

相关推荐
Flittly5 小时前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了5 小时前
Java 生成二维码解决方案
java·后端
石山岭6 小时前
自己动手写了一个 Android 虚拟定位 App:GPSSimulate 技术实
android·前端
杉氧8 小时前
副作用 (Side Effects) 全攻略:如何像大师一样掌控 Composable 的生命周期?
android·架构·android jetpack
人活一口气10 小时前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
NE_STOP12 小时前
Vibe Coding -- 完整项目案例实操
java
荣码12 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
SimonKing12 小时前
Google第三方授权登录
java·后端·程序员
明月光81812 小时前
从一行 @Builder 说起:重新拾起 Java 的 Lombok、注解与 Builder 模式
java
Kapaseker12 小时前
Kotlin Toolchain 0.11 发布:主要是把 Amper 干没了
android·kotlin