Java 23 种设计模式:从踩坑到精通 | 单例模式 —— 你写的真的安全吗?(12种写法全揭秘)

23种设计模式【Java】全案例解析 具体解析 创建型 结构型 7个原则 单一职责原则【SINGLE RESPONSIBILITY PRINCIPLE】: 一个类负责一项职责。 里氏替换原则【LISKOV SUBSTITUTION PRINCIPLE】: 继承与派生的规则。 依赖倒置原则【DEPENDENCE INVERSION PRINCIPLE】: 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即针对接口编程,不要针对实现编程。 接口隔离原则【INTERFACE SEGREGATION PRINC 阅读详情

Java 23 种设计模式:从踩坑到精通 | 单例模式 —— 你写的真的安全吗?

摘要:你写的单例真的线程安全吗?本文一口气拆解 12 种 实现方式——从饿汉式到枚举,从 DCL 到 CAS,附反射/序列化/克隆攻击防御测试。结合 Spring、JDK 及 AI 时代新场景,帮你彻底掌握单例的正确选型与安全防御。读完本文,你将拥有一份可以应对面试与生产环境的单例“兵器谱”。

📖 《Java 23 种设计模式:从踩坑到精通》
开篇:系列介绍与目录 | 当前:单例模式 | 下一篇:工厂模式
🔗 返回系列总目录


1. 从“只有一个实例”说起

为什么我们需要单例?像数据库连接池、配置管理、线程池这类系统资源,应当全局只存在一份;多个实例不仅浪费内存,还会引发状态不一致。单例模式通过私有构造器和静态访问方法,严格控制实例数量。

但“保证只有一个实例”远没有听上去那么简单。接下来,我们将从最基础的实现开始,逐步升级到坚不可摧的版本。

1.1 单例模式的作用与学习意义

单例模式的核心作用是 确保一个类在整个系统运行期间有且仅有一个实例,并提供一个全局访问点。它能有效避免因创建多个实例导致的资源浪费、状态不一致或行为冲突。

学习单例的意义远不止“背出一种写法”:

  • 面试硬通货:它是面试中最高频的设计模式之一,关于线程安全(DCL + volatile)、反射/序列化破坏与防御、枚举单例等追问,直接区分背题与真懂。
  • 读懂框架的钥匙:Spring 容器默认的单例 Bean、JDK 的 Runtime 类、日志工厂等,本质都是单例思想的体现。理解了它,你才能真正看懂这些设计的意图。
  • 多线程与安全编程的实战入口:从饿汉式到 DCL 再到枚举,单例模式的演进浓缩了 JMM、指令重排、CAS、序列化机制等核心知识点,是学习并发与底层原理的绝佳抓手。
  • 设计原则的第一课:单例虽小,却蕴含了单一职责、开闭原则、依赖倒置等 SOLID 思想,是通往系统设计能力的启蒙模式。

2. 模式定义与 UML

单例模式保证一个类在 JVM 中只有一个实例,并提供一个全局访问点。
单例模式

  • 构造器私有 → 禁止外部 new
  • 静态变量持有唯一实例
  • 静态 getInstance() 作为全局访问口

📌 后续所有实现变体都围绕这一结构进行安全性和性能的增强。

3. 单例模式的 12 种写法

3.1 饿汉式 —— 类加载时直接创建

① 静态常量

public class Singleton {
    public static final Singleton INSTANCE = new Singleton();
    private Singleton() {}
}

✅ 最简单、天生线程安全;❌ 无懒加载,可能浪费内存。

② 静态代码块

public class Singleton {
    private static final Singleton INSTANCE;
    static {
        INSTANCE = new Singleton();
    }
    private Singleton() {}
}

✅ 可处理初始化异常;❌ 本质上仍是饿汉,同样无懒加载。

3.2 懒汉式 —— 用时才创建

③ 线程不安全懒汉

public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

⚠️ 并发下会创建多个实例,仅单线程环境可用,生产禁用。

④ 同步方法懒汉

public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

✅ 线程安全;❌ 每次调用都加锁,高并发下性能极差。

3.3 双重检查锁定(DCL) —— 性能与安全的平衡

⑤ 标准 DCL

public class Singleton {
    private static volatile Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

✅ 高性能 + 懒加载;⚠️ volatile 缺一不可,否则指令重排可能返回半初始化对象。

3.4 静态内部类 —— 优雅的懒加载

⑥ 静态内部类

public class Singleton {
    private Singleton() {}
    private static class Holder {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
}

✅ 懒加载 + 无锁 + 线程安全,日常开发首选之一,非常推荐。

3.5 枚举 —— 攻不破的堡垒

⑦ 枚举单例

public enum Singleton {
    INSTANCE;
    public void doSomething() {}
}
  • 反射攻击无效:Constructor.newInstance() 对枚举抛出异常
  • 序列化安全:反序列化自动返回同一实例
  • 克隆安全:枚举不可克隆

✅ 防反射、防序列化、防克隆,代码最少,最安全的单例写法。

3.6 容器式单例 —— 管理多种单例

⑧ 登记式(容器式)单例

public class SingletonManager {
    private static Map<String, Object> map = new ConcurrentHashMap<>();
    private SingletonManager() {}
    public static void registerService(String key, Object instance) {
        map.putIfAbsent(key, instance);
    }
    public static Object getService(String key) {
        return map.get(key);
    }
}

✅ 适合管理多种单例对象;❌ 需注意线程安全(使用 ConcurrentHashMap)。

3.7 线程内单例 —— 每个线程一个实例

⑨ ThreadLocal 单例

public class Singleton {
    private static final ThreadLocal<Singleton> threadLocal = ThreadLocal.withInitial(Singleton::new);
    private Singleton() {}
    public static Singleton getInstance() {
        return threadLocal.get();
    }
}

✅ 每个线程一个实例,适合线程内资源隔离(如数据库连接)。

3.8 无锁实现 —— CAS 乐观锁

⑩ CAS 原子操作

public class Singleton {
    private static final AtomicReference<Singleton> INSTANCE = new AtomicReference<>();
    private Singleton() {}
    public static Singleton getInstance() {
        for (;;) {
            Singleton current = INSTANCE.get();
            if (current != null) return current;
            current = new Singleton();
            if (INSTANCE.compareAndSet(null, current)) return current;
        }
    }
}

✅ 无锁高并发;⚠️ 构造函数可能被执行多次,轻量对象适用。
通过 AtomicReference 实现无锁线程安全,适合高并发场景。但要注意如果构造函数很重,可能会多次执行 new。

3.9 防止破坏的加强版(防御式写法)

⑪ 静态内部类 + 序列化/反射防御

在静态内部类的基础上,增加:

public class Singleton implements Serializable {
    private static final long serialVersionUID = 1L;
    private Singleton() {
        if (Holder.INSTANCE != null) {
            throw new RuntimeException("禁止反射创建实例");
        }
    }
    private static class Holder {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
    // 防止反序列化破坏
    private Object readResolve() {
        return Holder.INSTANCE;
    }
}

✅ 静态内部类的增强版,生产环境推荐,完整抵御反射、序列化攻击。

⑫ 枚举的变体:带属性的枚举

public enum Config {
    INSTANCE;
    private Properties props = new Properties();
    Config() { /* 加载配置 */ }
    public String getProperty(String key) { return props.getProperty(key); }
}

✅ 枚举的安全 + 复杂业务封装能力,单例配置管理首选。

4. 单例的破坏与防御

除了反射和反序列化,还有克隆攻击:

public class Singleton implements Cloneable {
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() { return INSTANCE; }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException("单例禁止克隆");
        // 或者直接 return INSTANCE;
    }
}

防御总结表:

攻击方式防御手段
反射构造器内判断实例是否已存在,抛异常
序列化添加 readResolve() 方法返回已存在实例
克隆重写 clone() 方法,抛异常或返回自身

枚举天生免疫这三种攻击。

5. 12 种写法对比一览

写法线程安全懒加载防反射防序列化推荐指数
饿汉-常量✓✗✗✗★★☆☆
饿汉-静态块✓✗✗✗★★☆☆
懒汉-不安全✗✓✗✗★☆☆☆
懒汉-同步✓✓✗✗★★☆☆
DCL✓✓✗✗(可防)★★★★
静态内部类✓✓✗(可防)✗(可防)★★★★★
枚举✓✓✓✓★★★★★
容器式✓✓✗✗★★★☆
ThreadLocal线程内✓✗✗★★☆☆
CAS✓✓✗✗★★★☆
静态内部类+防御✓✓✓✓★★★★★
带属性枚举✓✓✓✓★★★★★

✅ 建议:若无需继承其他类,优先使用枚举;否则选用静态内部类并添加防御代码。


📌 正在追更《Java 23 种设计模式:从踩坑到精通》?
点击右上角「关注」,不错过下一篇——工厂模式:还在写一坨 if-else 创建对象吗?
简单工厂、工厂方法、抽象工厂,你真的分得清吗?


6. 常见误区与面试高频题

❌ 误区1:单例就是全局变量
单例是控制实例化,可包含业务逻辑,不是简单的 static 变量。

❌ 误区2:加了 synchronized 就绝对线程安全
DCL 的指令重排问题已证明光有同步块不够,还需 volatile。

❌ 误区3:枚举单例无法懒加载
枚举类在首次被使用时才会初始化,效果类似饿汉式,但同样是“用时加载”。

💡 面试高频追问

  • 静态内部类为什么是懒加载的?→ 内部类在首次被引用时才会被加载。
  • 枚举单例能否被反射破坏?→ 不能,Constructor.newInstance() 中会对枚举进行特殊判断并抛出异常。
  • ThreadLocal 单例的典型应用场景?→ 每个线程需要独立的数据库连接或事务上下文时。
  • CAS 实现单例的缺点?→ 构造函数可能被执行多次,资源消耗大时不推荐。

7. 框架与 AI 时代中的单例应用

7.1 经典框架中的单例

  • Spring:默认 Bean 作用域为 singleton,DefaultSingletonBeanRegistry 用 Map 缓存所有单例 Bean,本质是容器式单例。
  • JDK:java.lang.Runtime 采用饿汉式;java.lang.System 中的许多工具方法也依赖单例思想。
  • Log4j/Logback:LoggerFactory.getLogger() 返回的 Logger 通常是静态内部类或容器式单例。

7.2 2026 AI 时代的新场景

在 AI 时代,单例模式非但没有过时,反而在管理共享资源、维护全局状态等新场景中演变为“能力中枢”:

  • 模型服务与推理客户端:大语言模型(LLM)的客户端对象和向量数据库连接是重量级资源,必须作为单例复用以避免重复加载。现代 AI 框架通过单例统一管理这些 API 客户端,保证效率与状态一致性。
  • AI 网关与模型路由器:当系统需要调用多个 LLM(如 GPT-4o、Claude、DeepSeek)时,模型路由器作为单例集中管理路由策略、成本控制、熔断降级等复杂逻辑,确保决策一致性。
  • 智能体(Agent)上下文管理:在多智能体协同场景中,单例为每个 Agent 提供独立的上下文空间,保证不同 Agent 间状态隔离,避免信息串扰或污染。
  • Prompt 模板与安全管理:提示词模板和 API Key 管理器通常以单例形式运行,实现统一加载、版本管理和安全轮转。
  • 遥测与可观测性中枢:全局的 Metrics 收集器、Trace 管理器、日志聚合器通常也是单例,保证数据一致性并避免重复初始化开销。

2026 年,单例模式依然是控制全局资源和状态的关键工具。它的角色已经演变为 AI 应用的“核心大管家”或“能力枢纽”,负责从模型加载、智能体状态、提示词到遥测数据的全方位管理与调度。


8. 你应该选哪一种?

  • 如果单例不需要继承其他类,优先使用枚举。
  • 如果需要继承或需要懒加载,使用 静态内部类 + 防御代码。
  • 在高并发且构造函数较轻时,CAS 实现 是一个有趣的替代。
  • 若要在每个线程内保持唯一实例(如用户会话上下文),选择 ThreadLocal 单例。
  • 当系统中有许多单例需要统一管理时,参考 容器式单例。

附录:Singleton UML 源码

@startuml
skinparam backgroundColor #FEFEFE
class Singleton {
  - {static} uniqueInstance : Singleton
  - Singleton()
  + {static} getInstance() : Singleton
}
@enduml

🧭 《Java 23 种设计模式:从踩坑到精通》快速导航

🔔 关注《Java 23 种设计模式:从踩坑到精通》,用 25 篇文章彻底吃透设计模式。
📦 福利预告:全系列代码及 UML 源码将在完结时统一打包开放,点击「关注」「收藏」第一时间获取。
🚀 下一篇:工厂模式 —— 还在写一坨 if-else?简单工厂→工厂方法→抽象工厂全演进
📌 除了设计模式,我也在深挖智能物流实战(WMS、托盘调度、机器学习落地)。欢迎点击头像,看看专栏 《出版社物流WMS智能调度实战》。技术相通,思路可鉴。

Java的23设计模式学习(课时一)单例模式 ◆设计模式的本质是面向对象设计原则的实际运用, 是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。 ◆正确使用设计模式具有以下优点: ◆可以提高程序员的思维能力、编程能力和设计能力。 ◆使程序设计更加标准化、 代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。 ◆使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。 阅读详情

相关推荐

分布式光纤传感(DFOS)DTS/DAS/DSS 三合一:10公里管线监测实战与数据解读

本文详细介绍了分布式光纤传感(DFOS)技术在10公里管线监测中的实战应用,通过DTS(温度)、DAS(振动)、DSS(应变)三合一系统,实现对管线健康状态的立体感知。文章涵盖工程部署、数据采集、多物理量数据融合及噪声抑制等关键技术,展示了如何通过一根光纤完成复杂监测任务,显著提升管线安全性和维护效率。

weixin_29168153的博客 307

Java 23 种设计模式:从踩坑到精通 —— 开篇及系列介绍

摘要:本文是《Java 23种设计模式:从踩坑到精通》系列的总入口与导航页。文章梳理了设计模式的起源与三大分类,结合SOLID六大原则,详解为什么2026年设计模式依然重要。提供25篇完整目录、面试高频Top10速记、场景速查索引、易混模式对比表及分级阅读路线,可作为长期收藏的设计模式学习手册。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 3333

新年美食鉴赏——基于注意力机制CBAM的美食101分类

新年美食鉴赏——基于注意力机制CBAM的美食101分类一、数据预处理1.数据集介绍2.读取标签3.统一命名4.整理图片路径5.划分训练集与验证集6.定义美食数据集二、注意力机制1.简介2.卷积块注意力网络——CBAM通道注意力模块CAM空间注意力模块SAM3.将通道、空间注意力模块合并三、基于卷积块注意力模块的ResNet-CBAM1.代码实现2.模型测试3.查看网络结构4.模型训练5.模型预测四、总结与升华个人简介 春节是一年当中最隆重、最盛大的节日,吃得最好的一餐可能就是年夜饭了,想想就很激动呢!随着新

zbp_12138的博客 1万+

Java--设计模式之单例模式+保证线程安全的5种写法(懒、汉、内、双、枚)

2

JustinQin 4293

【Claude Code】Claude Code 使用指南

本文介绍了AI编码助手Claude的基础和进阶操作指南。基础部分涵盖启动命令、模式切换(自动编辑/Plan/Yolo模式)、资源监控等核心功能,重点讲解了斜杠命令的使用方法。进阶操作详细说明了CLAUDE.md文件的创建与管理,包括项目规范、代码风格等内容的配置,以及如何通过该文件建立持久上下文。同时提醒了使用过程中的安全风险,建议通过配置文件限制AI对关键代码的访问权限。全文提供了完整的操作指引和安全建议,帮助开发者高效安全地使用Claude进行编码辅助。

大家好,我是敖云岚,一个沉迷代码的 “技术玩家”。擅长 Java、C++ 开发,对 MySQL、Redis、RabbitMQ 等技术也颇有研究。博客里既有硬核技术干货,也有诙谐幽默的编程日常分享。愿和你一起,笑着学技术,快乐敲代码! 1万+

大模型-高通qnn基础

提供较低级别、高度可定制的统一API,通过单独的库加速所有AI加速器核心上的AI模型, 可以直接用于针对特定的加速器核心或从流行的运行时(包括Qualcomm Neural Processing SDK、TensorFlow Lite和ONNX运行时)委派工作负载。一个支持异构计算、系统级配置的一体化SDK,旨在将AI工作负载引导到我们平台上的所有加速器核心。为开发人员提供灵活性,包括核心间协作支持和其他高级功能。是一个为训练好的神经网络模型提供高级量化和压缩技术的库。

点滴的岁月 4070

Java 23 种设计模式:从踩坑到精通 | 番外:单例模式 —— 全局唯一物流配置中心实战

摘要:单例模式确保一个类在全局只有一个实例,常用于管理配置、连接池等共享资源。本文结合智能物流中的“全局物流配置中心” 场景,从双重检查锁(DCL)、静态内部类到枚举实现,完整展示单例的 5 种写法,同时深入剖析多线程安全、反射攻击、反序列化陷阱等踩坑点,并给出 Spring 环境下的替代方案,帮你彻底掌握“全局唯一”的设计精髓。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 1081

《深入浅出图神经网络:GNN原理解析》学习笔记

期末考完了,该上道了 目录一、图的概述1.基本概念2.图的存储和遍历3.应用分类二、神经网络基础1.机器学习2.神经网络三、卷积神经网络(CNN)1.卷积与池化2.卷积神经网络四、表示学习1.意义2.自编码器五、图信号处理与图卷积神经网络1.矩阵计算前置知识2.图信号与图的拉普拉斯矩阵3.图傅里叶变换4.图滤波器(Graph Filter)5.图卷积神经网络(GCN) 一、图的概述 1.基本概念 1.顶点(Vertex)表示研究的对象,边(Edge)表示两个对象之间特定的研究关系 2.图为顶点和边的集合.

且视他人之疑目如盏盏鬼火,大胆地去走你的夜路 2039

Java 23 种设计模式:从踩坑到精通 | 系列总结:25 篇文章,我们学到了什么?

摘要:从单例模式的 12 种写法到访问者模式的双分派魔法,25 篇文章、23 种经典设计模式、超过十万字的深度拆解,我们完成了一次完整的 GoF 设计模式之旅。本文作为系列终章,不会简单罗列目录,而是帮你串联知识体系、对比易混淆模式、回顾实战踩坑、梳理框架应用,并给出后续深入学习的方向。无论你是从头追更还是中途加入,这篇总结都将帮你建立完整的设计模式知识地图。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 808

保姆级教程:用安卓手机+IP摄像头App,5分钟搭建一个免费的RTSP监控测试环境

本文提供了一份详细的保姆级教程,教你如何利用安卓手机和IP摄像头App在5分钟内搭建免费的RTSP监控测试环境。通过零成本方案,开发者可以快速获取实时视频流,适用于计算机视觉、物联网开发等多种场景。教程涵盖工具选型、配置详解、电脑端测试及OpenCV集成,助你高效完成开发测试。

weixin_27419879的博客 270

01 Python学习总结:Python简介及入门

Python 是一门高级编程语言,以其简洁、易读和强大的功能而广受欢迎。它适用于多种应用场景,包括 Web 开发、数据分析、人工智能、自动化脚本等。以下是 Python 的简介及入门知识总结,帮助你快速了解并开始学习 Python。

数据知道的博客 1万+

深入剖析Java 23种设计模式:从入门到精通

设计模式(Design Pattern)是一套被反复使用、多数人知晓、经过分类编目的、代码设计经验的总结。它的核心目的是为了实现代码的可重用性,让代码更易于被他人理解,同时保证代码的可靠性,使代码编写真正工程化,堪称软件工程的基石脉络。设计模式的概念最早起源于建筑领域,后来被引入到软件工程中。1995 年,Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为《Design Patterns - Elements of Reus

u010843275的博客 945

【Go语言实战】(9) gRPC 实现一个简单微服务

文章目录写在前面1. 安装1.1 grpc1.2 proto1.3 protobuf2. 编写代码2.1 初始化项目2.2 编写proto2.3 编写服务端2.4 实现客户端3. 演示 写在前面 这一次我们用gRPC实现获取用户的信息 1. 安装 1.1 grpc grpc的安装直接go get即可 go get google.golang.org/grpc 1.2 proto 下载proto,我是下载这个的。 然后解压出来把bin目录放在直接放在系统变量当中 1.3 protobuf 我们在

面向生活编程 3267

java设计模式--你真的学会单例模式了嘛?

文章目录前言一、什么是单例模式1.1 基本概念1.2单例模式的特点1.3 使用单例的注意事项二、为什么需要单例模式三、单例模式的常见写法3.1 立即加载与延迟加载3.1饿汉式单例3.2懒汉式单例3.3静态内部类单例3.4双重校验锁单例(最常用)3.5 小结四、枚举实现单例模式(最佳方式)4.1为什么不使用常规的模式实现单利4.2使用枚举实现单利的原因4.3使用枚举实现单利的好处:4.4实现五、单例面试题讲解1.请思考在一个jvm中会出现多个单例吗? 前言 现在是2020年5月12日22点51分,也是我重新开

ChengHuanHuaning的博客 2086

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

23种设计模式 Java 单例模式

设计模式分类 创建型模式 用于描述“怎样创建对象”,它的主要特点是将对象的创建与使用分离 GoF (四人组) 书中提供了单例,原型,工厂方法,抽象工厂,建造者等 5种创建型模式 单例设计模式 单例模式概念 单例模式 是JAVA 中最简单的设计模式之一 这种类型的设计模式属于创建型模式 他提供了一种创建对的最佳方式 这种模式设计一个单一的类 该类负责创建自己的对象 用时确保只有单个对象被创建 这个类提供了一种访问其唯一的对象的方式。 单例模式的实现 饿汉式 饿汉式:类加载就是导致该单实例对象被创建 类加载的时

m0_46937429的博客 1214

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

设计模式:23种设计模式之单例模式

还是举ThreadA和ThreadB的例子:当Thread经过第一次检查对象为null时,会接着去加锁,然后去执行new SingletonLazy(),上边已经分析过了,改步骤存在重排现象,如果发生重排,即instance分配了内存地址,但是很没有完成初始化工作,而此时ThreadB,刚好执行第一次检查(没有加锁),instance已经分配了地址空间,不再为null,那么ThreadB会获取到没有完成初始化的instance,这就出现了问题。下述为饿汉式的写法,满足了上边说的第1,2条要求。

王小二(海阔天空) 1222

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

23种设计模式之单例模式

设计模式是前辈们对代码开发经验的总结,是解决特定问题的一系列套路,他不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案 1995年,GoF合作出版了《设计模式:可复用面向对象软件的基础》一书,收录了23中设计模式,从此树立了软件设计模式领域的里程碑,人称GoF设计模式

JAVA开发区的博客 346

23种设计模式之单例模式的各类写法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

u014412527的博客 284

Java23种设计模式之单例模式

Java23种设计模式之单例模式 单例模式 Ensure a class only has one instance,and provide a global point of access to it. ​ 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 何时使用 当系统需要某个类只有一个实例的时候 优点 单例模式的类唯一实例由其本身控制,可以很好的控制用户何时访问它。 ...

肖睿的博客 287

Java--设计模式之单例模式+保证线程安全的5种写法(懒、汉、内、双

百科:设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式是软件行业的通用的设计标准,在Java同样通用,主要有23种设计模式如下:有的小伙伴可能会问,这么多,学得完吗?答:不好意思,不要太自信了,一般人还真学不完,不过一些常用的设计模式,例如上图中标红的单例模式工厂模式代理模式等设计模式,还是需要花些时间和精力去多多了解一下,相信会对自己在程序设计或写代码时有很大的帮助。本文主要来聊一聊设计模式中创建型的单例模式,进入正文~

2401_84264727的博客 314

手撕设计模式-单例模式详细总结和常见代码踩坑

详细总结了单例模式的所有实现方式和闭坑大法,非常适合总结和学习。

帅哥趣谈 648

23种设计模式之单例模式以及在MyBatis中的应用

MyBatis

qq_43538697的博客 920

浅谈23种设计模式(单例模式)

浅谈23中设计模式(java版) 单例模式 什么是设计模式 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结,使用设计模式的目的是为了提高代码的可重用性,使得代码更加符合人类的理解思维。 什么是单例模式 单例顾名思义在整个系统中只有一个类的实例对象 ...

良子的博客 851

java23种设计模式理解和练习总结

思路源泉来自这类原文:Java开发中的23种设计模式详解(转)有些人看了这篇可能只是转载或者收藏,对我来说就是写,练习,要有自己的理解。看完保证你了解了主干,并会用格式。本文以问题来驱动,以UML图来理解设计模式1、工厂方法模式分三种。先直接看下面这个先。1-1、普通工厂模式description:说白了在代码体现就是建立一个工厂,然后里面有个生产方法创建实现同一个接口的对应的实现类对象。exer...

宇宙中最不可理解之事,乃宇宙是可以理解的 2999

【Linux】线程安全进阶:单例模式、可重入函数与死锁排查

本文从线程池的单例管理出发,介绍饿汉模式与懒汉模式,并进一步分析多线程环境下单例创建的线程安全问题。随后区分线程安全与可重入函数的概念,结合多锁场景讲解死锁产生的四个必要条件及常见规避方法,最后补充 STL 容器、unique_ptr、shared_ptr、CAS、自旋锁和读写锁在线程并发中的使用边界,帮助建立更完整的 Linux/C++ 并发安全认识。

2402_87731470的博客 716
上一篇: Java 23 种设计模式:从踩坑到精通 —— 开篇及系列介绍
下一篇: 《Java 100 天进阶之路》第36篇:选择最适合自己的NIO,一探流技术
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值