【单例模式】

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

相关推荐
m0_7482331712 小时前
PHP7.4重磅特性全解析
android
蜗牛、Z12 小时前
Android 日常开发Adb常用命令附档
android·adb
感谢地心引力19 小时前
安卓、苹果手机无线投屏到Windows
android·windows·ios·智能手机·安卓·苹果·投屏
惊讶的猫19 小时前
探究StringBuilder和StringBuffer的线程安全问题
java·开发语言
jmxwzy19 小时前
Spring全家桶
java·spring·rpc
Halo_tjn19 小时前
基于封装的专项 知识点
java·前端·python·算法
Fleshy数模20 小时前
从数据获取到突破限制:Python爬虫进阶实战全攻略
java·开发语言
像少年啦飞驰点、20 小时前
零基础入门 Spring Boot:从“Hello World”到可上线的 Web 应用全闭环指南
java·spring boot·web开发·编程入门·后端开发
苍煜20 小时前
万字详解Maven打包策略:从基础插件到多模块实战
java·maven
有来技术20 小时前
Spring Boot 4 + Vue3 企业级多租户 SaaS:从共享 Schema 架构到商业化套餐设计
java·vue.js·spring boot·后端