【单例模式】

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

相关推荐
硬件学长森哥3 小时前
Android影像基础--cameraAPI2核心流程
android·计算机视觉
我真的是大笨蛋3 小时前
K8S-Pod(下)
java·笔记·云原生·容器·kubernetes
碳水加碳水3 小时前
Java代码审计实战:XML外部实体注入(XXE)深度解析
java·安全·web安全·代码审计
努力也学不会java4 小时前
【设计模式】 原型模式
java·设计模式·原型模式
方渐鸿5 小时前
【2024】k8s集群 图文详细 部署安装使用(两万字)
java·运维·容器·kubernetes·k8s·运维开发·持续部署
学亮编程手记5 小时前
K8S v1.33 版本主要新特性介绍
java·容器·kubernetes
Haven-6 小时前
Java-面试八股文-JVM篇
java·jvm·面试
我真的是大笨蛋6 小时前
JVM调优总结
java·jvm·数据库·redis·缓存·性能优化·系统架构
wjs0406 小时前
Git常用的命令
java·git·gitlab
superlls6 小时前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法