【单例模式】

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()时创建,避免类加载时立即初始化(饿汉式单例的资源浪费问题)。

相关推荐
Java微观世界3 分钟前
Object核心类深度剖析
java·后端
louisgeek5 分钟前
Android OkHttp Interceptor
android
MrSYJ7 分钟前
为什么HttpSecurity会初始化创建两次
java·后端·程序员
大王派来巡山的小旋风9 分钟前
Kotlin基本用法三
android·kotlin
hinotoyk13 分钟前
TimeUnit源码分享
java
Jerry说前后端44 分钟前
Android 移动端 UI 设计:前端常用设计原则总结
android·前端·ui
bytebeats1 小时前
Jetpack Compose 1.9: 核心新特性简介
android·android jetpack
Icey_World1 小时前
Mysql笔记-错误条件\处理程序
android
AAA修煤气灶刘哥1 小时前
Java+AI 驱动的体检报告智能解析:从 PDF 提取到数据落地全指南
java·人工智能·后端
wxy3191 小时前
嵌入式LINUX——————TCP并发服务器
java·linux·网络